proteaaudio 0.6.2 → 0.6.3
raw patch · 4 files changed
+86/−10 lines, 4 files
Files
- Sound/ProteaAudio.chs +5/−0
- cbits/proteaaudio_binding.cpp +78/−9
- cbits/proteaaudio_binding.h +2/−0
- proteaaudio.cabal +1/−1
Sound/ProteaAudio.chs view
@@ -5,6 +5,8 @@ finishAudio, loaderAvailable, volume,+ sampleFromMemoryWav,+ sampleFromMemoryOgg, sampleFromFile, soundActive, soundStopAll,@@ -26,7 +28,10 @@ {#fun initAudio {`Int', `Int', `Int'} -> `Bool'#} {#fun finishAudio {} -> `()'#} {#fun loaderAvailable {`String'} -> `Bool'#}+{#fun sampleFromMemoryWav {id `Ptr CChar', `Int', `Float'} -> `Sample' toSample#}+{#fun sampleFromMemoryOgg {id `Ptr CChar', `Int', `Float'} -> `Sample' toSample#} {#fun sampleFromFile {`String', `Float'} -> `Sample' toSample#}+ {#fun volume {`Float', `Float'} -> `()'#} {#fun soundActive {} -> `Int'#} {#fun soundStopAll {} -> `()'#}
cbits/proteaaudio_binding.cpp view
@@ -1,6 +1,55 @@ #include "proteaaudio_binding.h" #include "proAudioRt.h" +typedef struct {+ unsigned char * data;+ size_t size;+ size_t pos;+} MEM_FILE;++static size_t mem_fread ( void * ptr, size_t size, size_t count, FILE * stream_ ) {+ MEM_FILE * stream = (MEM_FILE*)stream_;+ if (!ptr || !stream) return 0;+ size_t remain = stream->size - stream->pos;+ if (remain <= 0) return 0;+ size_t cnt = size*count;+ size_t bytes = (cnt>remain)?remain:cnt;+ memcpy(ptr,&stream->data[stream->pos],bytes);+ stream->pos = stream->pos + bytes;+ return cnt;+}++static AudioSample* loadWavFromMemory(unsigned char * ptr, size_t len) {+ MEM_FILE* fp = new MEM_FILE();+ if (!fp) return 0;+ fp->data = ptr;+ fp->size = len;+ fp->pos = 0;+ AudioSample * pSample = AudioSample::readWav((FILE*)fp, mem_fread);+ delete fp;+ return pSample;+}++extern "C" {+extern int stb_vorbis_decode_memory(unsigned char *mem, int len, int *channels, int* sample_rate, short **output);+};++static AudioSample* loadOggFromMemory(unsigned char * file_data_ptr, size_t file_data_len) {+ int channels, sampleRate;+ short *decoded;+ int len = stb_vorbis_decode_memory(file_data_ptr, file_data_len, &channels, &sampleRate, &decoded);+ if(len<0) return 0;+ // convert to AudioSample:+ unsigned int size = len*channels*sizeof(short);+ unsigned char * data = new unsigned char[size];+ if(!data) return 0;+ memcpy(data,decoded, size);+ free(decoded);+ return new AudioSample(data, size, channels, sampleRate, 16);+}+++ // generic int initAudio(int nTracks, int frequency, int chunkSize) { DeviceAudio* pAudio = DeviceAudioRt::create(nTracks, frequency, chunkSize);@@ -13,55 +62,75 @@ int loaderAvailable(char* suffix) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return 0;+ if((&audio) == nullptr) return 0; return audio.loaderAvailable(suffix); } void volume(float left, float right) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return;+ if((&audio) == nullptr) return; audio.volume(left,right); } sample_t sampleFromFile(char* filename, float volume) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return 0;+ if((&audio) == nullptr) return 0; return (int)audio.sampleFromFile(filename, volume); } +sample_t sampleFromMemoryWav(char *data, int size, float volume) {+ DeviceAudio & audio = DeviceAudio::singleton();+ if((&audio) == nullptr) return 0;+ AudioSample* pSample = loadWavFromMemory((unsigned char*)data, size);+ if(!pSample) return 0;+ unsigned int ret = audio.sampleFromMemory(*pSample, volume);+ delete pSample;+ return (int)ret;+}++sample_t sampleFromMemoryOgg(char *data, int size, float volume) {+ DeviceAudio & audio = DeviceAudio::singleton();+ if((&audio) == nullptr) return 0;+ AudioSample* pSample = loadOggFromMemory((unsigned char*)data, size);+ if(!pSample) return 0;+ unsigned int ret = audio.sampleFromMemory(*pSample, volume);+ delete pSample;+ return (int)ret;+}+ int soundActive() { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return 0;+ if((&audio) == nullptr) return 0; return (int)audio.soundActive(); } void soundStopAll() { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return;+ if((&audio) == nullptr) return; audio.soundStop(); } // sound void soundLoop(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return;+ if((&audio) == nullptr) return; audio.soundLoop(sample, volumeL,volumeR,disparity,pitch); } void soundPlay(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return;+ if((&audio) == nullptr) return; audio.soundPlay(sample, volumeL,volumeR,disparity,pitch); } int soundUpdate(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return 0;+ if((&audio) == nullptr) return 0; return audio.soundUpdate(sample, volumeL,volumeR,disparity,pitch); } int soundStop(sample_t sample) { DeviceAudio & audio = DeviceAudio::singleton();- if(!&audio) return 0;+ if((&audio) == nullptr) return 0; return audio.soundStop(sample); }
cbits/proteaaudio_binding.h view
@@ -8,6 +8,8 @@ void finishAudio(); int loaderAvailable(char* suffix); void volume(float left, float right);+sample_t sampleFromMemoryWav(char *data, int size, float volume);+sample_t sampleFromMemoryOgg(char *data, int size, float volume); sample_t sampleFromFile(char* filename, float volume); int soundActive(); void soundStopAll();
proteaaudio.cabal view
@@ -1,5 +1,5 @@ Name: proteaaudio-Version: 0.6.2+Version: 0.6.3 Synopsis: A wrapper for the proteaaudio library. Description: A wrapper for the proteaaudio library. http://viremo.eludi.net/proteaAudio/ License: BSD3