packages feed

proteaaudio 0.6.2 → 0.6.3

raw patch · 4 files changed

+86/−10 lines, 4 files

Files

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