summaryrefslogtreecommitdiffstats
path: root/nebu/audio/SourceSample.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'nebu/audio/SourceSample.cpp')
-rw-r--r--nebu/audio/SourceSample.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/nebu/audio/SourceSample.cpp b/nebu/audio/SourceSample.cpp
new file mode 100644
index 0000000..8e8ffb5
--- /dev/null
+++ b/nebu/audio/SourceSample.cpp
@@ -0,0 +1,80 @@
+#include "audio/nebu_SourceSample.h"
+
+#include <assert.h>
+#include <string.h>
+
+namespace Sound {
+ SourceSample::SourceSample(System *system) {
+ _system = system;
+
+ _buffer = NULL;
+ _buffersize = 8192;
+
+ _position = 0;
+ _decoded = 0;
+ }
+
+ SourceSample::~SourceSample() {
+ // fprintf(stderr, "nebu_SourceSample destructor called\n");
+ if(_buffer)
+ delete _buffer;
+ // Source::~Source();
+ }
+
+ void SourceSample::Load(char *filename) {
+#define BUFSIZE 1024 * 1024
+ SDL_RWops *rwops;
+
+ rwops = SDL_RWFromFile(filename, "rb");
+
+ Sound_Sample *sample = Sound_NewSample(rwops, NULL,
+ _system->GetAudioInfo(),
+ _buffersize );
+ if(sample == NULL) {
+ fprintf(stderr, "[error] failed loading sample from '%s': %s\n",
+ filename, Sound_GetError());
+ return;
+ }
+
+ Sound_DecodeAll(sample);
+
+ _buffersize = sample->buffer_size;
+ _buffer = new Uint8[_buffersize];
+ memcpy(_buffer, sample->buffer, _buffersize);
+
+ Sound_FreeSample(sample);
+
+ // fprintf(stderr, "done decoding sample '%s'\n", filename);
+ _position = 0;
+ }
+
+ int SourceSample::Mix(Uint8 *data, int len) {
+ if(_buffer == NULL)
+ return 0;
+
+ int volume = (int)(_volume * SDL_MIX_MAXVOLUME);
+ assert(len < _buffersize);
+
+ if(len < _buffersize - _position) {
+ SDL_MixAudio(data, _buffer + _position, len, volume);
+ _position += len;
+ } else {
+ SDL_MixAudio(data, _buffer + _position, _buffersize - _position,
+ volume);
+ len -= _buffersize - _position;
+
+ // printf("end of sample reached!\n");
+ if(_loop) {
+ if(_loop != 255)
+ _loop--;
+
+ _position = 0;
+ SDL_MixAudio(data, _buffer + _position, len, volume);
+ _position += len;
+ } else {
+ _isPlaying = 0;
+ }
+ }
+ return 1;
+ }
+}