diff --git a/Sound/ProteaAudio.chs b/Sound/ProteaAudio.chs
--- a/Sound/ProteaAudio.chs
+++ b/Sound/ProteaAudio.chs
@@ -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 {} -> `()'#}
diff --git a/cbits/proteaaudio_binding.cpp b/cbits/proteaaudio_binding.cpp
--- a/cbits/proteaaudio_binding.cpp
+++ b/cbits/proteaaudio_binding.cpp
@@ -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);
 }
diff --git a/cbits/proteaaudio_binding.h b/cbits/proteaaudio_binding.h
--- a/cbits/proteaaudio_binding.h
+++ b/cbits/proteaaudio_binding.h
@@ -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();
diff --git a/proteaaudio.cabal b/proteaaudio.cabal
--- a/proteaaudio.cabal
+++ b/proteaaudio.cabal
@@ -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
