aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Audio/SDL/Source.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-07-27 00:01:34 +0800
committerchai <chaifix@163.com>2018-07-27 00:01:34 +0800
commitb855ebb91ad8d97617ec1aa418b4add84670a07d (patch)
treeb11847a1879a2582c9cfd380074ad4c70f17a1a8 /src/libjin/Audio/SDL/Source.h
parent1a882936e91826e4d69584745e16a79650272015 (diff)
*change name
Diffstat (limited to 'src/libjin/Audio/SDL/Source.h')
-rw-r--r--src/libjin/Audio/SDL/Source.h116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/libjin/Audio/SDL/Source.h b/src/libjin/Audio/SDL/Source.h
new file mode 100644
index 0000000..38f7ec4
--- /dev/null
+++ b/src/libjin/Audio/SDL/Source.h
@@ -0,0 +1,116 @@
+#ifndef __JIN_SOURCE_SDL_H
+#define __JIN_SOURCE_SDL_H
+#include "../../modules.h"
+#if JIN_MODULES_AUDIO && JIN_AUDIO_SDLAUDIO
+
+#include <vector>
+#include <queue>
+#include <stack>
+#include <exception>
+
+#include "../source.h"
+
+namespace jin
+{
+namespace audio
+{
+
+ typedef struct SDLSourceCommand;
+ class SDLSourceManager;
+
+ class SDLSource : public Source
+ {
+
+ public:
+
+ ~SDLSource();
+
+ static SDLSource* createSource(const char* file);
+ static SDLSource* createSource(void* mem, size_t size);
+
+ /* ISource interface */
+ void play() override;
+ void stop() override;
+ void pause() override;
+ void resume() override;
+ void rewind() override;
+ bool isStopped() const override;
+ bool isPaused() const override;
+ void setPitch(float pitch) override;
+ // Ͻ
+ void setVolume(float volume) override;
+ bool setLoop(bool loop) override;
+ void setRate(float rate) override;
+
+ inline void handle(SDLSourceManager* manager, SDLSourceCommand* cmd);
+ inline void process(void* buffer, size_t size);
+
+ private:
+
+ SDLSource();
+
+ void decode_wav(void* mem, int size);
+ void decode_ogg(void* mem, int size);
+
+ inline bool is(int state) const { return (status.state & state) == state; }
+
+ struct
+ {
+ const void* data; // Ƶ
+ int length; // dataֽڳ
+ const void* end; // dataβ = (unsigned char*)data + size
+ int samplerate; // Ƶ
+ unsigned char bitdepth; // ÿsampleıس
+ int samples; // sample = size / (bitdepth / 8)
+ unsigned char channels; // channel1(mono)2(stereo)
+ } raw;
+
+ /* Procedure controller variable */
+ struct
+ {
+ int pos; // ǰŵsample
+ int pitch; // pitch
+ int state; // ǰ״̬
+ bool loop; // loop or not
+ int volume; //
+ } status;
+
+ };
+
+ class SDLSourceManager
+ {
+
+ public:
+
+ static SDLSourceManager* get();
+
+ /* Process function */
+ static void processCommands();
+ static void processSources(void* buffer, size_t size);
+
+ static void removeSource(SDLSource* source);
+ static void pushSource(SDLSource* source);
+ static SDLSourceCommand* getCommand();
+ static void pushCommand(SDLSourceCommand* cmd);
+
+ static SDLSourceManager* manager;
+
+ static std::queue<SDLSourceCommand*> commands;
+ static std::stack<SDLSourceCommand*> commandsPool;
+ static std::vector<SDLSource*> sources; // processing sources
+
+ };
+
+ class SourceException : public std::exception
+ {
+ const char * what() const throw ()
+ {
+ return "Load Source Exception";
+ }
+ };
+
+}
+}
+
+#endif // JIN_MODULES_AUDIO && JIN_AUDIO_SDLAUDIO
+#endif \ No newline at end of file