diff options
Diffstat (limited to 'src/libjin/Audio/SDL')
-rw-r--r-- | src/libjin/Audio/SDL/je_sdl_audio.h | 83 | ||||
-rw-r--r-- | src/libjin/Audio/SDL/je_sdl_source.cpp | 3 | ||||
-rw-r--r-- | src/libjin/Audio/SDL/je_sdl_source.h | 186 |
3 files changed, 253 insertions, 19 deletions
diff --git a/src/libjin/Audio/SDL/je_sdl_audio.h b/src/libjin/Audio/SDL/je_sdl_audio.h index 01da7b3..b13dc10 100644 --- a/src/libjin/Audio/SDL/je_sdl_audio.h +++ b/src/libjin/Audio/SDL/je_sdl_audio.h @@ -18,9 +18,15 @@ namespace JinEngine #define SDLAUDIO_BYTEDEPTH (SDLAUDIO_BITDEPTH >> 3) #define SDLAUDIO_CHANNELS 2 + /// + /// Audio system SDL implementation. + /// class SDLAudio : public AudioManager<SDLAudio> { public: + /// + /// SDL audio setting. + /// struct Setting : SettingBase { public: @@ -28,29 +34,95 @@ namespace JinEngine int samples; // sample<=samplerate }; - /* IAudio interface */ + /// + /// Play all sources whose state is playing. + /// void play() override; + + /// + /// Stop and remove all sources from the queue. + /// void stop() override; + + /// + /// Pause audio. + /// void pause() override; + + /// + /// Resume audio. + /// void resume() override; + + /// + /// Set global audio volume. + /// void setVolume(float volume) override; - /* process functions*/ + + /// + /// Process all commands in the queue. + /// void processCommands(); + + /// + /// Process all sources. + /// + /// @param buffer Source buffer. + /// @param len Source length. + /// void processSources(void* buffer, size_t len); + + /// + /// Process audio buffer. + /// + /// @param buffer Audio stream buffer. + /// @param len Length of stream buffer. + /// void processBuffer(void* buffer, size_t len); + + /// + /// Goon process. + /// + /// @return True if sucessful, otherwise return false. + /// bool goOnProcess(); - /* thread-safe */ + + /// + /// Lock audio device. + /// void lock(); + + /// + /// Unlock audio device. + /// void unlock(); private: singleton(SDLAudio); + + /// + /// SDL audio constructor. + /// SDLAudio() {}; + + /// + /// SDL audio destructor. + /// ~SDLAudio() {}; - /* subsystem interface */ + + /// + /// Initialize audio system. + /// + /// @param setting Audio setting. + /// bool initSystem(const SettingBase* setting) override; + + /// + /// Quit audio system. + /// void quitSystem() override; + // Audio device id. unsigned int audioDevice; }; @@ -59,4 +131,5 @@ namespace JinEngine } // namespace JinEngine #endif // LIBJIN_MODULES_AUDIO && LIBJIN_AUDIO_SDLAUDIO -#endif // __JE_AUDIO_SDL_H + +#endif // __JE_AUDIO_SDL_H
\ No newline at end of file diff --git a/src/libjin/Audio/SDL/je_sdl_source.cpp b/src/libjin/Audio/SDL/je_sdl_source.cpp index 210d058..8f4a2dc 100644 --- a/src/libjin/Audio/SDL/je_sdl_source.cpp +++ b/src/libjin/Audio/SDL/je_sdl_source.cpp @@ -233,10 +233,9 @@ namespace JinEngine ActionFloat(SetVolume, clamp(volume, 0.0f, 1.0f)); } - bool SDLSource::setLoop(bool loop) + void SDLSource::setLoop(bool loop) { ActionBool(SetLoop, loop); - return false; } void SDLSource::setRate(float rate) diff --git a/src/libjin/Audio/SDL/je_sdl_source.h b/src/libjin/Audio/SDL/je_sdl_source.h index b32ecce..fe6abc3 100644 --- a/src/libjin/Audio/SDL/je_sdl_source.h +++ b/src/libjin/Audio/SDL/je_sdl_source.h @@ -16,39 +16,154 @@ namespace JinEngine { typedef struct SDLSourceCommand; + class SDLSourceManager; + /// + /// Audio source SDL implementation. + /// class SDLSource : public Source { public: + /// + /// Create source from raw source data file. + /// + /// @param file Audio source file. + /// @return Return source if create successful, otherwise return null. + /// static SDLSource* createSource(const char* file); + + /// + /// Create source from raw source data. + /// + /// @param mem Source data. + /// @param size Source data size. + /// @return Return source if create successful, otherwise return null. + /// static SDLSource* createSource(void* mem, size_t size); + /// + /// Source destructor. + /// ~SDLSource(); - /* ISource interface */ + + /// + /// Play source. + /// void play() override; + + /// + /// Stop source. + /// void stop() override; + + /// + /// Pause source. + /// void pause() override; + + /// + /// Resume source. + /// void resume() override; + + /// + /// Rewind source. + /// void rewind() override; + + /// + /// Return if the source is stopped. + /// + /// @return True if the source is stopped, otherwise return false. + /// bool isStopped() const override; + + /// + /// Return if the source is paused. + /// + /// @return True if the source is paused(, otherwise return false. + /// bool isPaused() const override; + + /// + /// Set pitch. + /// + /// @param pitch Pitch of source. + /// void setPitch(float pitch) override; + + /// + /// Set volume. + /// + /// @param volume Volume of source. + /// void setVolume(float volume) override; - bool setLoop(bool loop) override; + + /// + /// Set source loop. + /// + /// @param loop Looping or not. + /// + void setLoop(bool loop) override; + + /// + /// Set source rate. + /// + /// @param rate Rate of source. + /// void setRate(float rate) override; - /* handle and process anduio clip */ + + /// + /// Handle a specific command. + /// + /// @param manager Audio manager. + /// @param cmd Source commad. + /// inline void handle(SDLSourceManager* manager, SDLSourceCommand* cmd); + + /// + /// Process decoded source data. + /// + /// @param buffer Source data. + /// @param size Data size. + /// inline void process(void* buffer, size_t size); protected: + /// + /// Source constructor. + /// SDLSource(); - /* decode raw audio data */ + + /// + /// Decode wav file. + /// + /// @param mem Wav file data. + /// @param size Wav data size. + /// void decode_wav(void* mem, int size); + + /// + /// Decode ogg file. + /// + /// @param mem ogg file data. + /// @param size ogg data size. + /// void decode_ogg(void* mem, int size); - /* check state */ - inline bool is(int state) const { return (status.state & state) == state; } + /// + /// Check source state. + /// + /// @param state State to be checked. + /// @return True if state is given state, otherwise return false. + /// + inline bool is(int state) const + { + return (status.state & state) == state; + } + + // Source data. struct{ const void* data; // Ƶ int length; // dataֽڳ @@ -58,7 +173,7 @@ namespace JinEngine int samples; // sample = size / (bitdepth / 8) unsigned char channels; // channel1(mono)2(stereo) } raw; - /* Procedure controller variable */ + // Procedure controller variable. struct{ int pos; // ǰŵsample int pitch; // pitch @@ -69,22 +184,68 @@ namespace JinEngine }; + /// + /// Source manager. + /// class SDLSourceManager { public: + /// + /// Get manager singleton. + /// + /// @return Singleton of SDL source manager. + /// static SDLSourceManager* get(); - /* Process function */ + /// + /// Process commands. + /// void processCommands(); + + /// + /// Process sources. + /// + /// @param buffer Source data. + /// @param size Size of source data. + /// void processSources(void* buffer, size_t size); - /* control flow */ + + /// + /// Clear source queue. + /// + /// This function will stop all sources. + /// void removeAllSource(); + + /// + /// Remove specific source. + /// + /// @param source SDL audio source. + /// void removeSource(SDLSource* source); + + /// + /// Push specific source into queue. + /// + /// @param source SDL audio source. + /// void pushSource(SDLSource* source); + + /// + /// Get command from queue. + /// + /// @return Command at first place. + /// SDLSourceCommand* getCommand(); + + /// + /// Push command. + /// + /// @param cmd Spcific command. + /// void pushCommand(SDLSourceCommand* cmd); - private : + private: std::queue<SDLSourceCommand*> commands; std::stack<SDLSourceCommand*> commandsPool; std::vector<SDLSource*> sources; // processing sources @@ -94,7 +255,7 @@ namespace JinEngine class SourceException : public std::exception { - const char * what() const throw () + const char* what() const throw () { return "Load Source Exception"; } @@ -104,4 +265,5 @@ namespace JinEngine } // namespace JinEngine #endif // LIBJIN_MODULES_AUDIO && LIBJIN_AUDIO_SDLAUDIO -#endif // __JE_SOURCE_SDL_H + +#endif // __JE_SOURCE_SDL_H
\ No newline at end of file |