diff --git a/source/Metaphrasis.cpp b/source/Metaphrasis.cpp deleted file mode 100644 index 5955074..0000000 --- a/source/Metaphrasis.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Metaphrasis is a static conversion class for transforming RGBA image - * buffers into verious GX texture formats for Wii homebrew development. - * Copyright (C) 2008 Armin Tamzarian - * - * This file is part of Metaphrasis. - * - * Metaphrasis is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Metaphrasis is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Metaphrasis. If not, see . - */ - -#include "Metaphrasis.h" - -/** - * Default constructor for the Metaphrasis class. - */ - -Metaphrasis::Metaphrasis() { -} - -/** - * Default destructor for the Metaphrasis class. - */ - -Metaphrasis::~Metaphrasis() { -} - -/** - * Convert the specified RGBA data buffer into the I4 texture format - * - * This routine converts the RGBA data buffer into the I4 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToI4(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = bufferWidth * bufferHeight >> 1; - uint32_t* dataBufferI4 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferI4, 0x00, bufferSize); - - uint32_t *src = (uint32_t *)rgbaBuffer; - uint8_t *dst = (uint8_t *)dataBufferI4; - - for(uint16_t y = 0; y < bufferHeight; y += 8) { - for(uint16_t x = 0; x < bufferWidth; x += 8) { - for(uint16_t rows = 0; rows < 8; rows++) { - *dst++ = (src[((y + rows) * bufferWidth) + (x + 0)] & 0xf0) | ((src[((y + rows) * bufferWidth) + (x + 1)] & 0xf0) >> 4); - *dst++ = (src[((y + rows) * bufferWidth) + (x + 2)] & 0xf0) | ((src[((y + rows) * bufferWidth) + (x + 3)] & 0xf0) >> 4); - *dst++ = (src[((y + rows) * bufferWidth) + (x + 4)] & 0xf0) | ((src[((y + rows) * bufferWidth) + (x + 5)] & 0xf0) >> 4); - *dst++ = (src[((y + rows) * bufferWidth) + (x + 5)] & 0xf0) | ((src[((y + rows) * bufferWidth) + (x + 7)] & 0xf0) >> 4); - } - } - } - DCFlushRange(dataBufferI4, bufferSize); - - return dataBufferI4; -} - -/** - * Convert the specified RGBA data buffer into the I8 texture format - * - * This routine converts the RGBA data buffer into the I8 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToI8(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = bufferWidth * bufferHeight; - uint32_t* dataBufferI8 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferI8, 0x00, bufferSize); - - uint32_t *src = (uint32_t *)rgbaBuffer; - uint8_t *dst = (uint8_t *)dataBufferI8; - - for(uint16_t y = 0; y < bufferHeight; y += 4) { - for(uint16_t x = 0; x < bufferWidth; x += 8) { - for(uint16_t rows = 0; rows < 4; rows++) { - *dst++ = src[((y + rows) * bufferWidth) + (x + 0)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 1)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 2)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 3)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 4)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 5)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 6)] & 0xff; - *dst++ = src[((y + rows) * bufferWidth) + (x + 7)] & 0xff; - } - } - } - DCFlushRange(dataBufferI8, bufferSize); - - return dataBufferI8; -} - -/** - * Downsample the specified RGBA value data buffer to an IA4 value. - * - * This routine downsamples the given RGBA data value into the IA4 texture data format. - * - * @param rgba A 32-bit RGBA value to convert to the IA4 format. - * @return The IA4 value of the given RGBA value. - */ - -uint8_t Metaphrasis::convertRGBAToIA4(uint32_t rgba) { - uint8_t i, a; - - i = (rgba >> 8) & 0xf0; - a = (rgba ) & 0xff; - - return i | (a >> 4); -} - -/** - * Convert the specified RGBA data buffer into the IA4 texture format - * - * This routine converts the RGBA data buffer into the IA4 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToIA4(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = bufferWidth * bufferHeight; - uint32_t* dataBufferIA4 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferIA4, 0x00, bufferSize); - - uint32_t *src = (uint32_t *)rgbaBuffer; - uint8_t *dst = (uint8_t *)dataBufferIA4; - - for(uint16_t y = 0; y < bufferHeight; y += 4) { - for(uint16_t x = 0; x < bufferWidth; x += 8) { - for(uint16_t rows = 0; rows < 4; rows++) { - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 0)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 1)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 2)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 3)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 4)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 5)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 6)]); - *dst++ = Metaphrasis::convertRGBAToIA4(src[((y + rows) * bufferWidth) + (x + 7)]); - } - } - } - DCFlushRange(dataBufferIA4, bufferSize); - - return dataBufferIA4; -} - -/** - * Downsample the specified RGBA value data buffer to an IA8 value. - * - * This routine downsamples the given RGBA data value into the IA8 texture data format. - * - * @param rgba A 32-bit RGBA value to convert to the IA8 format. - * @return The IA8 value of the given RGBA value. - */ - -uint16_t Metaphrasis::convertRGBAToIA8(uint32_t rgba) { - uint8_t i, a; - - i = (rgba >> 8) & 0xff; - a = (rgba ) & 0xff; - - return (i << 8) | a; -} - -/** - * Convert the specified RGBA data buffer into the IA8 texture format - * - * This routine converts the RGBA data buffer into the IA8 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToIA8(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = (bufferWidth * bufferHeight) << 1; - uint32_t* dataBufferIA8 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferIA8, 0x00, bufferSize); - - uint32_t *src = (uint32_t *)rgbaBuffer; - uint16_t *dst = (uint16_t *)dataBufferIA8; - - for(uint16_t y = 0; y < bufferHeight; y += 4) { - for(uint16_t x = 0; x < bufferWidth; x += 4) { - for(uint16_t rows = 0; rows < 4; rows++) { - *dst++ = Metaphrasis::convertRGBAToIA8(src[((y + rows) * bufferWidth) + (x + 0)]); - *dst++ = Metaphrasis::convertRGBAToIA8(src[((y + rows) * bufferWidth) + (x + 1)]); - *dst++ = Metaphrasis::convertRGBAToIA8(src[((y + rows) * bufferWidth) + (x + 2)]); - *dst++ = Metaphrasis::convertRGBAToIA8(src[((y + rows) * bufferWidth) + (x + 3)]); - } - } - } - DCFlushRange(dataBufferIA8, bufferSize); - - return dataBufferIA8; -} - -/** - * Convert the specified RGBA data buffer into the RGBA8 texture format - * - * This routine converts the RGBA data buffer into the RGBA8 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToRGBA8(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = (bufferWidth * bufferHeight) << 2; - uint32_t* dataBufferRGBA8 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferRGBA8, 0x00, bufferSize); - - uint8_t *src = (uint8_t *)rgbaBuffer; - uint8_t *dst = (uint8_t *)dataBufferRGBA8; - - for(uint16_t block = 0; block < bufferHeight; block += 4) { - for(uint16_t i = 0; i < bufferWidth; i += 4) { - for (uint16_t c = 0; c < 4; c++) { - for (uint16_t ar = 0; ar < 4; ar++) { - *dst++ = src[(((i + ar) + ((block + c) * bufferWidth)) * 4) + 3]; - *dst++ = src[((i + ar) + ((block + c) * bufferWidth)) * 4]; - } - } - for (uint16_t c = 0; c < 4; c++) { - for (uint16_t gb = 0; gb < 4; gb++) { - *dst++ = src[(((i + gb) + ((block + c) * bufferWidth)) * 4) + 1]; - *dst++ = src[(((i + gb) + ((block + c) * bufferWidth)) * 4) + 2]; - } - } - } - } - DCFlushRange(dataBufferRGBA8, bufferSize); - - return dataBufferRGBA8; -} - -/** - * Downsample the specified RGBA value data buffer to an RGB565 value. - * - * This routine downsamples the given RGBA data value into the RGB565 texture data format. - * Attribution for this routine is given fully to NoNameNo of GRRLIB Wii library. - * - * @param rgba A 32-bit RGBA value to convert to the RGB565 format. - * @return The RGB565 value of the given RGBA value. - */ - -uint16_t Metaphrasis::convertRGBAToRGB565(uint32_t rgba) { - uint8_t r, g, b; - - r = (((rgba >> 24) & 0xff) * 31) / 255; - g = (((rgba >> 16) & 0xff) * 63) / 255; - b = (((rgba >> 8) & 0xff) * 31) / 255; - - return (((r << 6) | g ) << 5 ) | b; -} - -/** - * Convert the specified RGBA data buffer into the RGB565 texture format - * - * This routine converts the RGBA data buffer into the RGB565 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToRGB565(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = (bufferWidth * bufferHeight) << 1; - uint32_t* dataBufferRGB565 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferRGB565, 0x00, bufferSize); - - uint32_t *src = (uint32_t *)rgbaBuffer; - uint16_t *dst = (uint16_t *)dataBufferRGB565; - - for(uint16_t y = 0; y < bufferHeight; y += 4) { - for(uint16_t x = 0; x < bufferWidth; x += 4) { - for(uint16_t rows = 0; rows < 4; rows++) { - *dst++ = Metaphrasis::convertRGBAToRGB565(src[((y + rows) * bufferWidth) + (x + 0)]); - *dst++ = Metaphrasis::convertRGBAToRGB565(src[((y + rows) * bufferWidth) + (x + 1)]); - *dst++ = Metaphrasis::convertRGBAToRGB565(src[((y + rows) * bufferWidth) + (x + 2)]); - *dst++ = Metaphrasis::convertRGBAToRGB565(src[((y + rows) * bufferWidth) + (x + 3)]); - } - } - } - DCFlushRange(dataBufferRGB565, bufferSize); - - return dataBufferRGB565; -} - -/** - * Downsample the specified RGBA value data buffer to an RGB5A3 value. - * - * This routine downsamples the given RGBA data value into the RGB5A3 texture data format. - * Attribution for this routine is given fully to WiiGator via the TehSkeen forum. - * - * @param rgba A 32-bit RGBA value to convert to the RGB5A3 format. - * @return The RGB5A3 value of the given RGBA value. - */ - -uint16_t Metaphrasis::convertRGBAToRGB5A3(uint32_t rgba) { - uint32_t r, g, b, a; - uint16_t color; - - r = (rgba >> 24) & 0xff; - g = (rgba >> 16) & 0xff; - b = (rgba >> 8) & 0xff; - a = (rgba ) & 0xff; - - if (a > 0xe0) { - r = r >> 3; - g = g >> 3; - b = b >> 3; - - color = (r << 10) | (g << 5) | b; - color |= 0x8000; - } - else { - r = r >> 4; - g = g >> 4; - b = b >> 4; - a = a >> 5; - - color = (a << 12) | (r << 8) | (g << 4) | b; - } - - return color; -} - -/** - * Convert the specified RGBA data buffer into the RGB5A3 texture format - * - * This routine converts the RGBA data buffer into the RGB5A3 texture format and returns a pointer to the converted buffer. - * - * @param rgbaBuffer Buffer containing the temporarily rendered RGBA data. - * @param bufferWidth Pixel width of the data buffer. - * @param bufferHeight Pixel height of the data buffer. - * @return A pointer to the allocated buffer. - */ - -uint32_t* Metaphrasis::convertBufferToRGB5A3(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight) { - uint32_t bufferSize = (bufferWidth * bufferHeight) << 1; - uint32_t* dataBufferRGB5A3 = (uint32_t *)memalign(32, bufferSize); - memset(dataBufferRGB5A3, 0x00, bufferSize); - - uint32_t *src = (uint32_t *)rgbaBuffer; - uint16_t *dst = (uint16_t *)dataBufferRGB5A3; - - for(uint16_t y = 0; y < bufferHeight; y += 4) { - for(uint16_t x = 0; x < bufferWidth; x += 4) { - for(uint16_t rows = 0; rows < 4; rows++) { - *dst++ = Metaphrasis::convertRGBAToRGB5A3(src[((y + rows) * bufferWidth) + (x + 0)]); - *dst++ = Metaphrasis::convertRGBAToRGB5A3(src[((y + rows) * bufferWidth) + (x + 1)]); - *dst++ = Metaphrasis::convertRGBAToRGB5A3(src[((y + rows) * bufferWidth) + (x + 2)]); - *dst++ = Metaphrasis::convertRGBAToRGB5A3(src[((y + rows) * bufferWidth) + (x + 3)]); - } - } - } - DCFlushRange(dataBufferRGB5A3, bufferSize); - - return dataBufferRGB5A3; -} diff --git a/source/Metaphrasis.h b/source/Metaphrasis.h deleted file mode 100644 index 3d5179d..0000000 --- a/source/Metaphrasis.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Metaphrasis is a static conversion class for transforming RGBA image - * buffers into verious GX texture formats for Wii homebrew development. - * Copyright (C) 2008 Armin Tamzarian - * - * This file is part of Metaphrasis. - * - * Metaphrasis is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Metaphrasis is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Metaphrasis. If not, see . - */ - -/** \mainpage Metaphrasis - * - * \section sec_intro Introduction - * - * Metaphrasis is a static conversion class for transforming RGBA image buffers into verious GX texture formats for Wii homebrew development. - *
- * Metaphrasis is written in C++ and makes use of a community standard and newly developed algorithms for conversion of 32-bit RGBA data buffers into various GX texture formats common to both the Gamecube and Wii platforms. - *

- * This library was developed in-full by Armin Tamzarian with the support of developers in \#wiibrew on EFnet, Chaosteil of libwiisprite, and DrTwox of GRRLIB. - * - * \section sec_installation_source Installation (Source Code) - * - * -# Extract the Metaphrasis archive. - * -# Copy the contents of the src directory into your project's development path. - * -# Include the Metaphrasis header file in your code using syntax such as the following: - * \code - * #include "Metaphrasis.h" - * \endcode - * - * \section sec_installation_library Installation (Library) - * - * -# Extract the Metaphrasis archive. - * -# Copy the contents of the lib directory into your devKitPro/libogc directory. - * -# Include the Metaphrasis header file in your code using syntax such as the following: - * \code - * #include "Metaphrasis.h" - * \endcode - * - * \section sec_usage Usage - * - * -# Create a buffer full of 32-bit RGBA values noting both the pixel height and width of the buffer. - * -# Call one of the many conversion routines from within your code. (Note: All methods within the Metaphrasis class are static and thus no class instance need be allocated) - * \code - * uint32_t* rgba8Buffer = Metaphrasis::convertBufferToRGBA8(rgbaBuffer, bufferWidth, bufferHeight); - * \endcode - * -# Free your temporary RGBA value buffer if you no longer need said values. - * - * Currently supported conversion routines are as follows: - * \li convertBufferToI4 - * \li convertBufferToI8 - * \li convertBufferToIA4 - * \li convertBufferToIA8 - * \li convertBufferToRGBA8 - * \li convertBufferToRGB565 - * \li convertBufferToRGB5A3 - * - * \section sec_license License - * - * Metaphrasis is distributed under the GNU Lesser General Public License. - * - * \section sec_contact Contact - * - * If you have any suggestions, questions, or comments regarding this library feel free to e-mail me at tamzarian1989 [at] gmail [dawt] com. - */ - -#ifndef METAPHRASIS_H_ -#define METAPHRASIS_H_ - -#include -#include -#include -#include - -/*! \class Metaphrasis - * \brief A static conversion class for transforming RGBA image buffers into verious GX texture formats for - * Wii homebrew development. - * \author Armin Tamzarian - * \version 0.1.0 - * - * Metaphrasis is a static conversion class for transforming RGBA image buffers into verious GX texture formats for - * Wii homebrew development. Metaphrasis is written in C++ and makes use of a community standard and newly developed - * algorithms for conversion of 32-bit RGBA data buffers into various GX texture formats common to both the Gamecube - * and Wii platforms. - */ -class Metaphrasis { - public: - Metaphrasis(); - virtual ~Metaphrasis(); - - static uint32_t* convertBufferToI4(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - static uint32_t* convertBufferToI8(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - static uint32_t* convertBufferToIA4(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - static uint32_t* convertBufferToIA8(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - static uint32_t* convertBufferToRGBA8(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - static uint32_t* convertBufferToRGB565(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - static uint32_t* convertBufferToRGB5A3(uint32_t* rgbaBuffer, uint16_t bufferWidth, uint16_t bufferHeight); - - static uint8_t convertRGBAToIA4(uint32_t rgba); - static uint16_t convertRGBAToIA8(uint32_t rgba); - static uint16_t convertRGBAToRGB565(uint32_t rgba); - static uint16_t convertRGBAToRGB5A3(uint32_t rgba); - -}; - -#endif /*METAPHRASIS_H_*/ diff --git a/source/libwiigui/gui.h b/source/libwiigui/gui.h index 9a509fc..73ead04 100644 --- a/source/libwiigui/gui.h +++ b/source/libwiigui/gui.h @@ -46,7 +46,6 @@ #include "video.h" #include "filelist.h" #include "input.h" -#include "oggplayer.h" #include "sigslot.h" extern FreeTypeGX * fontSystem; @@ -81,12 +80,6 @@ enum STATE_DISABLED2 }; -enum -{ - SOUND_PCM, - SOUND_OGG -}; - enum { IMAGE_TEXTURE, @@ -139,43 +132,6 @@ typedef struct _POINT { #define EFFECT_SCALE 128 #define EFFECT_COLOR_TRANSITION 256 -//!Sound conversion and playback. A wrapper for other sound libraries - ASND, libmad, ltremor, etc -class GuiSound -{ - public: - //!Constructor - //!\param s Pointer to the sound data - //!\param l Length of sound data - //!\param t Sound format type (SOUND_PCM or SOUND_OGG) - GuiSound(const u8 * s, int l, int t); - //!Destructor - ~GuiSound(); - //!Start sound playback - void Play(); - //!Stop sound playback - void Stop(); - //!Pause sound playback - void Pause(); - //!Resume sound playback - void Resume(); - //!Checks if the sound is currently playing - //!\return true if sound is playing, false otherwise - bool IsPlaying(); - //!Set sound volume - //!\param v Sound volume (0-100) - void SetVolume(int v); - //!Set the sound to loop playback (only applies to OGG) - //!\param l Loop (true to loop) - void SetLoop(bool l); - protected: - const u8 * sound; //!< Pointer to the sound data - int type; //!< Sound format type (SOUND_PCM or SOUND_OGG) - s32 length; //!< Length of sound data - s32 voice; //!< Currently assigned ASND voice channel - s32 volume; //!< Sound volume (0-100) - bool loop; //!< Loop sound playback -}; - //!Menu input trigger management. Determine if action is neccessary based on input data by comparing controller input data to a specific trigger element. class GuiTrigger { @@ -810,15 +766,6 @@ class GuiButton : public GuiElement //!\param t Pointer to GuiText object //!\param n Index of label to set (optional, default is 0) void SetLabelClick(GuiText* t, int n = 0); - //!Sets the sound to play on over - //!\param s Pointer to GuiSound object - void SetSoundOver(GuiSound * s); - //!Sets the sound to play on hold - //!\param s Pointer to GuiSound object - void SetSoundHold(GuiSound * s); - //!Sets the sound to play on click - //!\param s Pointer to GuiSound object - void SetSoundClick(GuiSound * s); //!Constantly called to draw the GuiButton void Draw(); //!Constantly called to allow the GuiButton to respond to updated input data @@ -837,9 +784,6 @@ class GuiButton : public GuiElement GuiText * labelOver[3]; //!< Label(s) to display for STATE_SELECTED GuiText * labelHold[3]; //!< Label(s) to display for STATE_HELD GuiText * labelClick[3]; //!< Label(s) to display for STATE_CLICKED - GuiSound * soundOver; //!< Sound to play for STATE_SELECTED - GuiSound * soundHold; //!< Sound to play for STATE_HELD - GuiSound * soundClick; //!< Sound to play for STATE_CLICKED }; typedef struct _keytype { @@ -899,8 +843,6 @@ class GuiKeyboard : public GuiWindow GuiImageData * keyMediumOver; GuiImageData * keyLarge; GuiImageData * keyLargeOver; -// GuiSound * keySoundOver; -// GuiSound * keySoundClick; GuiTrigger * trigA; int letterPos; @@ -994,8 +936,6 @@ class GuiOptionBrowser : public GuiElement GuiImageData * arrowUp; GuiImageData * arrowUpOver; -// GuiSound * btnSoundOver; -// GuiSound * btnSoundClick; GuiTrigger * trigA; }; @@ -1044,8 +984,6 @@ class GuiFileBrowser : public GuiElement GuiImageData * scrollbarBox; GuiImageData * scrollbarBoxOver; - GuiSound * btnSoundOver; - GuiSound * btnSoundClick; GuiTrigger * trigA; GuiTrigger * trigHeldA; }; diff --git a/source/libwiigui/gui_button.cpp b/source/libwiigui/gui_button.cpp index 32dbf59..6a56160 100644 --- a/source/libwiigui/gui_button.cpp +++ b/source/libwiigui/gui_button.cpp @@ -34,9 +34,6 @@ GuiButton::GuiButton(int w, int h) labelClick[i] = NULL; } - soundOver = NULL; - soundHold = NULL; - soundClick = NULL; selectable = true; holdable = false; clickable = true; @@ -109,18 +106,6 @@ void GuiButton::SetLabelClick(GuiText* txt, int n) labelClick[n] = txt; if(txt) txt->SetParent(this); } -void GuiButton::SetSoundOver(GuiSound * snd) -{ - soundOver = snd; -} -void GuiButton::SetSoundHold(GuiSound * snd) -{ - soundHold = snd; -} -void GuiButton::SetSoundClick(GuiSound * snd) -{ - soundClick = snd; -} /** * Draw the button on screen @@ -175,9 +160,6 @@ void GuiButton::Update(GuiTrigger * t) if(this->Rumble()) rumbleRequest[t->chan] = 1; - if(soundOver) - soundOver->Play(); - if(effectsOver && !effects) { // initiate effects @@ -233,8 +215,6 @@ void GuiButton::Update(GuiTrigger * t) { this->SetState(STATE_CLICKED, t->chan); - if(soundClick) - soundClick->Play(); } } else if(trigger[i]->type == TRIGGER_BUTTON_ONLY) diff --git a/source/libwiigui/gui_codeboard.cpp b/source/libwiigui/gui_codeboard.cpp index 1b82685..9862590 100644 --- a/source/libwiigui/gui_codeboard.cpp +++ b/source/libwiigui/gui_codeboard.cpp @@ -65,20 +65,18 @@ GuiCodeboard::GuiCodeboard(char * t, u32 max) else if(i == 3) keyTextboxImg[i]->SetPosition(75, 0); this->Append(keyTextboxImg[i]); - + kbText[i] = new GuiText("\0", 20, (GXColor){0, 0, 0, 0xff}); kbText[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); kbText[i]->SetPosition(keyTextboxImg[i]->GetLeft() + keyTextboxImg[i]->GetWidth()/2, 13); this->Append(kbText[i]); } - + key = new GuiImageData(keyboard_key_png); keyOver = new GuiImageData(keyboard_key_over_png); keyMedium = new GuiImageData(keyboard_mediumkey_png); keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png); -// keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM); -// keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM); trigA = new GuiTrigger; trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); trigB = new GuiTrigger; @@ -86,7 +84,7 @@ GuiCodeboard::GuiCodeboard(char * t, u32 max) int distance = 40; int pos = (width-(3*key->GetWidth()+2*distance))/2; - + keyBackImg = new GuiImage(keyMedium); keyBackOverImg = new GuiImage(keyMediumOver); keyBackText = new GuiText("i", 40, (GXColor){0, 0, 0, 0xff}); @@ -95,8 +93,6 @@ GuiCodeboard::GuiCodeboard(char * t, u32 max) keyBack->SetImage(keyBackImg); keyBack->SetImageOver(keyBackOverImg); keyBack->SetLabel(keyBackText); -// keyBack->SetSoundOver(keySoundOver); -// keyBack->SetSoundClick(keySoundClick); keyBack->SetTrigger(trigA); keyBack->SetTrigger(trigB); keyBack->SetPosition(pos-keyMedium->GetWidth()+key->GetWidth(), 3*(key->GetWidth() + 20)+80); @@ -110,8 +106,6 @@ GuiCodeboard::GuiCodeboard(char * t, u32 max) keyEmpty->SetImage(keyEmptyImg); keyEmpty->SetImageOver(keyEmptyOverImg); keyEmpty->SetLabel(keyEmptyText); -// keyEmpty->SetSoundOver(keySoundOver); -// keyEmpty->SetSoundClick(keySoundClick); keyEmpty->SetTrigger(trigA); keyEmpty->SetPosition(pos+2*(key->GetWidth()+distance), 3*(key->GetWidth() + 20)+80); keyEmpty->SetEffectGrow(); @@ -133,8 +127,6 @@ GuiCodeboard::GuiCodeboard(char * t, u32 max) keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight()); keyBtn[i][j]->SetImage(keyImg[i][j]); keyBtn[i][j]->SetImageOver(keyImgOver[i][j]); -// keyBtn[i][j]->SetSoundOver(keySoundOver); -// keyBtn[i][j]->SetSoundClick(keySoundClick); keyBtn[i][j]->SetTrigger(trigA); keyBtn[i][j]->SetLabel(keyTxt[i][j]); keyBtn[i][j]->SetPosition(pos+j*(key->GetWidth()+distance), i*(key->GetWidth() + 20)+80); @@ -168,8 +160,6 @@ GuiCodeboard::~GuiCodeboard() delete keyOver; delete keyMedium; delete keyMediumOver; -// delete keySoundOver; -// delete keySoundClick; delete trigA; for(int i=0; i<4; i++) @@ -227,15 +217,15 @@ void GuiCodeboard::Update(GuiTrigger * t) if(update) { txt[0] = keys[i][j].ch; - + keyTxt[i][j]->SetText(txt); } - + if(keyBtn[i][j]->GetState() == STATE_CLICKED) { if((signed)strlen(kbtextstr) < kbtextmaxlen) kbtextstr[strlen(kbtextstr)] = keys[i][j].ch; - + int letter = strlen(kbtextstr) -1; string buffer = kbtextstr; kbText[letter]->SetText(buffer.substr(letter, 1).c_str()); diff --git a/source/libwiigui/gui_keyboard.cpp b/source/libwiigui/gui_keyboard.cpp index 58e4cf1..2222809 100644 --- a/source/libwiigui/gui_keyboard.cpp +++ b/source/libwiigui/gui_keyboard.cpp @@ -147,9 +147,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyLarge = new GuiImageData(keyboard_largekey_png); keyLargeOver = new GuiImageData(keyboard_largekey_over_png); -// keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, SOUND_PCM); -// keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, SOUND_PCM); - keyBrImg = new GuiImage(keyMedium); keyBrOverImg = new GuiImage(keyMediumOver); keyBrText = new GuiText(tr("Linebreak"), 20, (GXColor){0, 0, 0, 0xff}); @@ -157,14 +154,12 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyBr->SetImage(keyBrImg); keyBr->SetImageOver(keyBrOverImg); keyBr->SetLabel(keyBrText); -// keyBr->SetSoundOver(keySoundOver); -// keyBr->SetSoundClick(keySoundClick); keyBr->SetTrigger(trigA); keyBr->SetPosition(0, 4*42+80); keyBr->SetEffectGrow(); if(br) this->Append(keyBr); - + keyBackImg = new GuiImage(keyMedium); keyBackOverImg = new GuiImage(keyMediumOver); keyBackText = new GuiText("Back", 20, (GXColor){0, 0, 0, 0xff}); @@ -172,8 +167,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyBack->SetImage(keyBackImg); keyBack->SetImageOver(keyBackOverImg); keyBack->SetLabel(keyBackText); -// keyBack->SetSoundOver(keySoundOver); -// keyBack->SetSoundClick(keySoundClick); keyBack->SetTrigger(trigA); keyBack->SetPosition(10*42+40, 0*42+80); keyBack->SetEffectGrow(); @@ -186,8 +179,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyCaps->SetImage(keyCapsImg); keyCaps->SetImageOver(keyCapsOverImg); keyCaps->SetLabel(keyCapsText); -// keyCaps->SetSoundOver(keySoundOver); -// keyCaps->SetSoundClick(keySoundClick); keyCaps->SetTrigger(trigA); keyCaps->SetPosition(0, 2*42+80); keyCaps->SetEffectGrow(); @@ -200,8 +191,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyShift->SetImage(keyShiftImg); keyShift->SetImageOver(keyShiftOverImg); keyShift->SetLabel(keyShiftText); -// keyShift->SetSoundOver(keySoundOver); -// keyShift->SetSoundClick(keySoundClick); keyShift->SetTrigger(trigA); keyShift->SetPosition(21, 3*42+80); keyShift->SetEffectGrow(); @@ -212,8 +201,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keySpace = new GuiButton(keyLarge->GetWidth(), keyLarge->GetHeight()); keySpace->SetImage(keySpaceImg); keySpace->SetImageOver(keySpaceOverImg); -// keySpace->SetSoundOver(keySoundOver); -// keySpace->SetSoundClick(keySoundClick); keySpace->SetTrigger(trigA); keySpace->SetPosition(0, 4*42+80); keySpace->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); @@ -227,8 +214,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyEmpty->SetImage(keyEmptyImg); keyEmpty->SetImageOver(keyEmptyOverImg); keyEmpty->SetLabel(keyEmptyText); -// keyEmpty->SetSoundOver(keySoundOver); -// keyEmpty->SetSoundClick(keySoundClick); keyEmpty->SetTrigger(trigA); keyEmpty->SetPosition(10*42+40, 4*42+80); keyEmpty->SetEffectGrow(); @@ -251,8 +236,6 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, bool Br) keyBtn[i][j] = new GuiButton(key->GetWidth(), key->GetHeight()); keyBtn[i][j]->SetImage(keyImg[i][j]); keyBtn[i][j]->SetImageOver(keyImgOver[i][j]); -// keyBtn[i][j]->SetSoundOver(keySoundOver); -// keyBtn[i][j]->SetSoundClick(keySoundClick); keyBtn[i][j]->SetTrigger(trigA); keyBtn[i][j]->SetLabel(keyTxt[i][j]); keyBtn[i][j]->SetPosition(j*42+21*i+40, i*42+80); @@ -306,8 +289,6 @@ GuiKeyboard::~GuiKeyboard() delete keyMediumOver; delete keyLarge; delete keyLargeOver; -// delete keySoundOver; -// delete keySoundClick; delete trigA; for(int i=0; i<4; i++) @@ -337,7 +318,7 @@ void GuiKeyboard::Update(GuiTrigger * t) } bool update = false; - + if(keySpace->GetState() == STATE_CLICKED) { keySpace->SetState(STATE_SELECTED, t->chan); @@ -345,14 +326,14 @@ void GuiKeyboard::Update(GuiTrigger * t) { for(int x = strlen(kbtextstr); x > kbText->GetLetterPos() + letterPos; x--) kbtextstr[x] = kbtextstr[x-1]; - + kbtextstr[kbText->GetLetterPos() + letterPos] = ' '; - + if(strlen(kbtextstr) > MAX_KEYBOARD_DISPLAY) letterPos++; else kbText->SetLetterPos(kbText->GetLetterPos() +1); - + kbText->SetText(GetDisplayText(letterPos, kbtextstr)); textpointerImg->SetPosition(-kbText->GetTextWidth()/2 + kbText->GetTextWidthToPosition(kbText->GetLetterPos()) +1, 10); } @@ -364,7 +345,7 @@ void GuiKeyboard::Update(GuiTrigger * t) { for(int i = kbText->GetLetterPos() + letterPos -1; i < (signed)strlen(kbtextstr) -1; i++) kbtextstr[i] = kbtextstr[i +1]; - + kbtextstr[strlen(kbtextstr) -1] = 0; if(letterPos > 0) { @@ -376,7 +357,7 @@ void GuiKeyboard::Update(GuiTrigger * t) kbText->SetText(GetDisplayText(letterPos, kbtextstr)); kbText->SetLetterPos(kbText->GetLetterPos()-1); } - + textpointerImg->SetPosition(-kbText->GetTextWidth()/2 + kbText->GetTextWidthToPosition(kbText->GetLetterPos()) +1, 10); } } @@ -387,14 +368,14 @@ void GuiKeyboard::Update(GuiTrigger * t) { for(int x = strlen(kbtextstr); x > kbText->GetLetterPos() + letterPos; x--) kbtextstr[x] = kbtextstr[x-1]; - + kbtextstr[kbText->GetLetterPos() + letterPos] = '¶'; - + if(strlen(kbtextstr) > MAX_KEYBOARD_DISPLAY) letterPos++; else kbText->SetLetterPos(kbText->GetLetterPos() +1); - + kbText->SetText(GetDisplayText(letterPos, kbtextstr)); textpointerImg->SetPosition(-kbText->GetTextWidth()/2 + kbText->GetTextWidthToPosition(kbText->GetLetterPos()) +1, 10); } @@ -403,7 +384,7 @@ void GuiKeyboard::Update(GuiTrigger * t) { while (strlen(kbtextstr) > 0) kbtextstr[strlen(kbtextstr)-1] = 0; - + letterPos = 0; kbText->SetLetterPos(0); kbText->SetText(GetDisplayText(letterPos, kbtextstr)); @@ -425,12 +406,12 @@ void GuiKeyboard::Update(GuiTrigger * t) else if(textpointerBtn->GetState() == STATE_CLICKED) { int pos = kbText->GetTextMaxWidth((int)t->wpad->ir.x-48 - (width - kbText->GetTextWidth()) /2); - + if(pos == 0) textpointerImg->SetPosition(-kbText->GetTextWidth()/2, 10); else textpointerImg->SetPosition(-kbText->GetTextWidth()/2 + pos + 1, 10); - + textpointerBtn->SetState(STATE_SELECTED, t->chan); } @@ -463,9 +444,9 @@ void GuiKeyboard::Update(GuiTrigger * t) { for(int x = strlen(kbtextstr); x > kbText->GetLetterPos() + letterPos; x--) kbtextstr[x] = kbtextstr[x-1]; - + kbtextstr[kbText->GetLetterPos() + letterPos] = keys[i][j].chShift; - + if(strlen(kbtextstr) > MAX_KEYBOARD_DISPLAY) letterPos++; else @@ -475,9 +456,9 @@ void GuiKeyboard::Update(GuiTrigger * t) { for(int x = strlen(kbtextstr); x > kbText->GetLetterPos() + letterPos; x--) kbtextstr[x] = kbtextstr[x-1]; - + kbtextstr[kbText->GetLetterPos() + letterPos] = keys[i][j].ch; - + if(strlen(kbtextstr) > MAX_KEYBOARD_DISPLAY) letterPos++; else @@ -486,7 +467,7 @@ void GuiKeyboard::Update(GuiTrigger * t) } kbText->SetText(GetDisplayText(letterPos, kbtextstr)); textpointerImg->SetPosition(-kbText->GetTextWidth()/2 + kbText->GetTextWidthToPosition(kbText->GetLetterPos()) +1, 10); - + if(shift) { shift ^= 1; @@ -527,7 +508,7 @@ void GuiKeyboard::Update(GuiTrigger * t) } else if(t->Down()) this->MoveSelectionVert(1); - + if(changed) { changed = false; diff --git a/source/libwiigui/gui_optionbrowser.cpp b/source/libwiigui/gui_optionbrowser.cpp index 519680d..e0b5c53 100644 --- a/source/libwiigui/gui_optionbrowser.cpp +++ b/source/libwiigui/gui_optionbrowser.cpp @@ -57,8 +57,6 @@ GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l) arrowUpBtn->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); arrowUpBtn->SetSelectable(false); arrowUpBtn->SetTrigger(trigA); -// arrowUpBtn->SetSoundOver(btnSoundOver); -// arrowUpBtn->SetSoundClick(btnSoundClick); arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); arrowDownBtn->SetParent(this); @@ -67,8 +65,6 @@ GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l) arrowDownBtn->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); arrowDownBtn->SetSelectable(false); arrowDownBtn->SetTrigger(trigA); -// arrowDownBtn->SetSoundOver(btnSoundOver); -// arrowDownBtn->SetSoundClick(btnSoundClick); for(int i=0; iSetImageOver(optionBg[i]); optionBtn[i]->SetPosition(2,30*i+3); optionBtn[i]->SetTrigger(trigA); -// optionBtn[i]->SetSoundClick(btnSoundClick); } } @@ -117,8 +112,6 @@ GuiOptionBrowser::~GuiOptionBrowser() delete arrowUpOver; delete trigA; -// delete btnSoundOver; -// delete btnSoundClick; for(int i=0; i= 0) - ASND_SetVoice(voice, VOICE_STEREO_16BIT, 48000, 0, - (u8 *)sound, length, vol, vol, NULL); - break; - - case SOUND_OGG: - voice = 0; - if(loop) - PlayOgg((char *)sound, length, 0, OGG_INFINITE_TIME); - else - PlayOgg((char *)sound, length, 0, OGG_ONE_TIME); - SetVolumeOgg(255*(volume/100.0)); - break; - } - #endif -} - -void GuiSound::Stop() -{ - #ifndef NO_SOUND - if(voice < 0) - return; - - switch(type) - { - case SOUND_PCM: - ASND_StopVoice(voice); - break; - - case SOUND_OGG: - StopOgg(); - break; - } - #endif -} - -void GuiSound::Pause() -{ - #ifndef NO_SOUND - if(voice < 0) - return; - - switch(type) - { - case SOUND_PCM: - ASND_PauseVoice(voice, 1); - break; - - case SOUND_OGG: - PauseOgg(1); - break; - } - #endif -} - -void GuiSound::Resume() -{ - #ifndef NO_SOUND - if(voice < 0) - return; - - switch(type) - { - case SOUND_PCM: - ASND_PauseVoice(voice, 0); - break; - - case SOUND_OGG: - PauseOgg(0); - break; - } - #endif -} - -bool GuiSound::IsPlaying() -{ - if(ASND_StatusVoice(voice) == SND_WORKING || ASND_StatusVoice(voice) == SND_WAITING) - return true; - else - return false; -} - -void GuiSound::SetVolume(int vol) -{ - #ifndef NO_SOUND - volume = vol; - - if(voice < 0) - return; - - int newvol = 255*(volume/100.0); - - switch(type) - { - case SOUND_PCM: - ASND_ChangeVolumeVoice(voice, newvol, newvol); - break; - - case SOUND_OGG: - SetVolumeOgg(255*(volume/100.0)); - break; - } - #endif -} - -void GuiSound::SetLoop(bool l) -{ - loop = l; -} diff --git a/source/oggplayer.c b/source/oggplayer.c deleted file mode 100644 index ccbc04a..0000000 --- a/source/oggplayer.c +++ /dev/null @@ -1,539 +0,0 @@ -/* - Copyright (c) 2008 Francisco Muñoz 'Hermes' - All rights reserved. - - Proper (standard) vorbis usage by Tantric, 2009 - Threading modifications/corrections by Tantric, 2009 - - Redistribution and use in source and binary forms, with or without modification, are - permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - The names of the contributors may not be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NO_SOUND - -#include "oggplayer.h" -#include -#include -#include - -/* functions to read the Ogg file from memory */ - -static struct -{ - char *mem; - int size; - int pos; -} file[4]; - -static int f_read(void * punt, int bytes, int blocks, int *f) -{ - int b; - int c; - int d; - - if (bytes * blocks <= 0) - return 0; - - blocks = bytes * blocks; - c = 0; - - while (blocks > 0) - { - b = blocks; - if (b > 4096) - b = 4096; - - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - if (file[d].size == 0) - return -1; - if ((file[d].pos + b) > file[d].size) - b = file[d].size - file[d].pos; - if (b > 0) - { - memcpy(punt, file[d].mem + file[d].pos, b); - file[d].pos += b; - } - } - else - b = read(*f, ((char *) punt) + c, b); - - if (b <= 0) - { - return c / bytes; - } - c += b; - blocks -= b; - } - return c / bytes; -} - -static int f_seek(int *f, ogg_int64_t offset, int mode) -{ - if(f==NULL) return(-1); - - int k, d; - mode &= 3; - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - k = 0; - - if (file[d].size == 0) - return -1; - - if (mode == 0) - { - if ((offset) >= file[d].size) - { - file[d].pos = file[d].size; - k = -1; - } - else if ((offset) < 0) - { - file[d].pos = 0; - k = -1; - } - else - file[d].pos = offset; - } - if (mode == 1) - { - if ((file[d].pos + offset) >= file[d].size) - { - file[d].pos = file[d].size; - k = -1; - } - else if ((file[d].pos + offset) < 0) - { - file[d].pos = 0; - k = -1; - } - else - file[d].pos += offset; - } - if (mode == 2) - { - - if ((file[d].size + offset) >= file[d].size) - { - file[d].pos = file[d].size; - k = -1; - } - else if ((file[d].size + offset) < 0) - { - file[d].pos = 0; - k = -1; - } - else - file[d].pos = file[d].size + offset; - } - - } - else - k = lseek(*f, (int) offset, mode); - - if (k < 0) - k = -1; - else - k = 0; - return k; -} - -static int f_close(int *f) -{ - int d; - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - file[d].size = 0; - file[d].pos = 0; - if (file[d].mem) - { - file[d].mem = (void *) 0; - } - return 0; - } - else - return close(*f); - return 0; -} - -static long f_tell(int *f) -{ - int k, d; - - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - k = file[d].pos; - } - else - k = lseek(*f, 0, 1); - - return (long) k; -} - -static int mem_open(char * ogg, int size) -{ - static int one = 1; - int n; - if (one) - { - one = 0; - for (n = 0; n < 4; n++) - file[n].size = 0; - } - - for (n = 0; n < 4; n++) - { - if (file[n].size == 0) - { - file[n].mem = ogg; - file[n].size = size; - file[n].pos = 0; - return (0x666 + n); - } - } - return -1; -} - -static int mem_close(int fd) -{ - if (fd >= 0x666 && fd <= 0x669) // it is a memory file descriptor? - { - fd -= 0x666; - file[fd].size = 0; - return 0; - } - else - return f_close(&fd); -} - -static ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) f_read, - (int (*)(void *, ogg_int64_t, int)) f_seek, - (int (*)(void *)) f_close, - (long (*)(void *)) f_tell -}; - -/* OGG control */ - -#define READ_SAMPLES 4096 // samples that it must read before to send -#define MAX_PCMOUT 4096 // minimum size to read ogg samples -typedef struct -{ - OggVorbis_File vf; - vorbis_info *vi; - int current_section; - - // OGG file operation - int fd; - int mode; - int eof; - int flag; - int volume; - int seek_time; - - /* OGG buffer control */ - short pcmout[2][READ_SAMPLES + MAX_PCMOUT * 2]; /* take 4k out of the data segment, not the stack */ - int pcmout_pos; - int pcm_indx; - -} private_data_ogg; - -static private_data_ogg private_ogg; - -// OGG thread control - -#define STACKSIZE 8192 - -static u8 oggplayer_stack[STACKSIZE]; -static lwpq_t oggplayer_queue = LWP_TQUEUE_NULL; -static lwp_t h_oggplayer = LWP_THREAD_NULL; -static int ogg_thread_running = 0; - -static void ogg_add_callback(int voice) -{ - if (!ogg_thread_running) - { - ASND_StopVoice(0); - return; - } - - if (private_ogg.flag & 128) - return; // Ogg is paused - - if (private_ogg.pcm_indx >= READ_SAMPLES) - { - if (ASND_AddVoice(0, - (void *) private_ogg.pcmout[private_ogg.pcmout_pos], - private_ogg.pcm_indx << 1) == 0) - { - private_ogg.pcmout_pos ^= 1; - private_ogg.pcm_indx = 0; - private_ogg.flag = 0; - LWP_ThreadSignal(oggplayer_queue); - } - } - else - { - if (private_ogg.flag & 64) - { - private_ogg.flag &= ~64; - LWP_ThreadSignal(oggplayer_queue); - } - } -} - -static void * ogg_player_thread(private_data_ogg * priv) -{ - int first_time = 1; - long ret; - - //init - LWP_InitQueue(&oggplayer_queue); - - priv[0].vi = ov_info(&priv[0].vf, -1); - - ASND_Pause(0); - - priv[0].pcm_indx = 0; - priv[0].pcmout_pos = 0; - priv[0].eof = 0; - priv[0].flag = 0; - priv[0].current_section = 0; - - ogg_thread_running = 1; - - while (!priv[0].eof && ogg_thread_running) - { - if (priv[0].flag) - LWP_ThreadSleep(oggplayer_queue); // wait only when i have samples to send - - if (priv[0].flag == 0) // wait to all samples are sent - { - if (ASND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos]) - && ASND_StatusVoice(0) != SND_UNUSED) - { - priv[0].flag |= 64; - continue; - } - if (priv[0].pcm_indx < READ_SAMPLES) - { - priv[0].flag = 3; - - if (priv[0].seek_time >= 0) - { - ov_time_seek(&priv[0].vf, priv[0].seek_time); - priv[0].seek_time = -1; - } - - ret - = ov_read( - &priv[0].vf, - (void *) &priv[0].pcmout[priv[0].pcmout_pos][priv[0].pcm_indx], - MAX_PCMOUT,/*0,2,1,*/&priv[0].current_section); - priv[0].flag &= 192; - if (ret == 0) - { - /* EOF */ - if (priv[0].mode & 1) - ov_time_seek(&priv[0].vf, 0); // repeat - else - priv[0].eof = 1; // stops - } - else if (ret < 0) - { - /* error in the stream. Not a problem, just reporting it in - case we (the app) cares. In this case, we don't. */ - if (ret != OV_HOLE) - { - if (priv[0].mode & 1) - ov_time_seek(&priv[0].vf, 0); // repeat - else - priv[0].eof = 1; // stops - } - } - else - { - /* we don't bother dealing with sample rate changes, etc, but - you'll have to*/ - priv[0].pcm_indx += ret >> 1; //get 16 bits samples - } - } - else - priv[0].flag = 1; - } - - if (priv[0].flag == 1) - { - if (ASND_StatusVoice(0) == SND_UNUSED || first_time) - { - first_time = 0; - if (priv[0].vi->channels == 2) - { - ASND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0, - (void *) priv[0].pcmout[priv[0].pcmout_pos], - priv[0].pcm_indx << 1, priv[0].volume, - priv[0].volume, ogg_add_callback); - priv[0].pcmout_pos ^= 1; - priv[0].pcm_indx = 0; - priv[0].flag = 0; - } - else - { - ASND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0, - (void *) priv[0].pcmout[priv[0].pcmout_pos], - priv[0].pcm_indx << 1, priv[0].volume, - priv[0].volume, ogg_add_callback); - priv[0].pcmout_pos ^= 1; - priv[0].pcm_indx = 0; - priv[0].flag = 0; - } - } - } - usleep(100); - } - ov_clear(&priv[0].vf); - priv[0].fd = -1; - priv[0].pcm_indx = 0; - - return 0; -} - -void StopOgg() -{ - ASND_StopVoice(0); - ogg_thread_running = 0; - - if(h_oggplayer != LWP_THREAD_NULL) - { - if(oggplayer_queue != LWP_TQUEUE_NULL) - LWP_ThreadSignal(oggplayer_queue); - LWP_JoinThread(h_oggplayer, NULL); - h_oggplayer = LWP_THREAD_NULL; - } - if(oggplayer_queue != LWP_TQUEUE_NULL) - { - LWP_CloseQueue(oggplayer_queue); - oggplayer_queue = LWP_TQUEUE_NULL; - } -} - -int PlayOgg(char * buf, int buflen, int time_pos, int mode) -{ - StopOgg(); - - private_ogg.fd = mem_open(buf, buflen); - - if (private_ogg.fd < 0) - { - private_ogg.fd = -1; - return -1; - } - - private_ogg.mode = mode; - private_ogg.eof = 0; - private_ogg.volume = 127; - private_ogg.flag = 0; - private_ogg.seek_time = -1; - - if (time_pos > 0) - private_ogg.seek_time = time_pos; - - if (ov_open_callbacks((void *) &private_ogg.fd, &private_ogg.vf, NULL, 0, callbacks) < 0) - { - mem_close(private_ogg.fd); // mem_close() can too close files from devices - private_ogg.fd = -1; - ogg_thread_running = 0; - return -1; - } - - if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread, - &private_ogg, oggplayer_stack, STACKSIZE, 80) == -1) - { - ogg_thread_running = 0; - ov_clear(&private_ogg.vf); - private_ogg.fd = -1; - return -1; - } - return 0; -} - -void PauseOgg(int pause) -{ - if (pause) - { - private_ogg.flag |= 128; - } - else - { - if (private_ogg.flag & 128) - { - private_ogg.flag |= 64; - private_ogg.flag &= ~128; - if (ogg_thread_running > 0) - { - LWP_ThreadSignal(oggplayer_queue); - } - } - } -} - -int StatusOgg() -{ - if (ogg_thread_running == 0) - return -1; // Error - else if (private_ogg.eof) - return 255; // EOF - else if (private_ogg.flag & 128) - return 2; // paused - else - return 1; // running -} - -void SetVolumeOgg(int volume) -{ - private_ogg.volume = volume; - ASND_ChangeVolumeVoice(0, volume, volume); -} - -s32 GetTimeOgg() -{ - int ret; - if (ogg_thread_running == 0 || private_ogg.fd < 0) - return 0; - ret = ((s32) ov_time_tell(&private_ogg.vf)); - if (ret < 0) - ret = 0; - - return ret; -} - -void SetTimeOgg(s32 time_pos) -{ - if (time_pos >= 0) - private_ogg.seek_time = time_pos; -} - -#endif diff --git a/source/oggplayer.h b/source/oggplayer.h deleted file mode 100644 index 1a249e6..0000000 --- a/source/oggplayer.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - Copyright (c) 2008 Francisco Muñoz 'Hermes' - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are - permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - The names of the contributors may not be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NO_SOUND - -#ifndef __OGGPLAYER_H__ -#define __OGGPLAYER_H__ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define OGG_ONE_TIME 0 -#define OGG_INFINITE_TIME 1 - -#define OGG_STATUS_RUNNING 1 -#define OGG_STATUS_ERR -1 -#define OGG_STATUS_PAUSED 2 -#define OGG_STATUS_EOF 255 - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* Player OGG functions */ -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* int PlayOgg(int fd, int time_pos, int mode); - - Play an Ogg file. This file can be loaded from memory (mem_open(void *ogg, int size_ogg)) or from device with open("device:file.ogg",O_RDONLY,0); - - NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail. - - -- Params --- - - fd: file descriptor from open() or mem_open() - - time_pos: initial time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds - - mode: Use OGG_ONE_TIME or OGG_INFINITE_TIME. When you use OGG_ONE_TIME the sound stops and StatusOgg() return OGG_STATUS_EOF - - return: 0- Ok, -1 Error - - */ - -int PlayOgg(char * buf, int buflen, int time_pos, int mode); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void StopOgg(); - - Stop an Ogg file. - - NOTE: The file is closed and the player thread is released - - -- Params --- - - - */ - -void StopOgg(); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void PauseOgg(int pause); - - Pause an Ogg file. - - -- Params --- - - pause: 0 -> continue, 1-> pause - - */ - -void PauseOgg(int pause); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* int StatusOgg(); - - Return the Ogg status - - -- Params --- - - - return: OGG_STATUS_RUNNING - OGG_STATUS_ERR -> not initialized? - OGG_STATUS_PAUSED - OGG_STATUS_EOF -> player stopped by End Of File - - */ - -int StatusOgg(); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void SetVolumeOgg(int volume); - - Set the Ogg playing volume. - NOTE: it change the volume of voice 0 (used for the Ogg player) - - -- Params --- - - volume: 0 to 255 (max) - - */ - -void SetVolumeOgg(int volume); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* s32 GetTimeOgg(); - - Return the Ogg time from the starts of the file - - -- Params --- - - return: 0 -> Ok or error condition (you must ignore this value) - >0 -> time in milliseconds from the starts - - */ - -s32 GetTimeOgg(); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void SetTimeOgg(s32 time_pos); - - Set the time position - - NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail. - - -- Params --- - - time_pos: time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds - - */ - -void SetTimeOgg(s32 time_pos); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -#ifdef __cplusplus -} -#endif - -#endif - -#endif diff --git a/updates b/updates index ef56d12..9b88cd9 100644 --- a/updates +++ b/updates @@ -16,6 +16,7 @@ - BUGFIX: only show 'launch priiloader' in external loaders prompt, if priiloader is really installed - changed loading address from 0x81230000 to 0x81330000 +- removed all sound related code - updated PNGu //rev37: