]> git.tdb.fi Git - libs/al.git/blobdiff - source/streamer.cpp
Split Sound into SoundDecoder and Waveform parts
[libs/al.git] / source / streamer.cpp
index 8fe7483cc735ffbc5fab4dfa3c8185b35fc5044d..bca08a2f06ea02c6ff357e90e42ba40ded4c02a7 100644 (file)
@@ -1,12 +1,5 @@
-/* $Id$
-
-This file is part of libmspal
-Copyright © 2008-2009  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include "buffer.h"
-#include "sound.h"
+#include "sounddecoder.h"
 #include "streamer.h"
 
 using namespace std;
@@ -16,7 +9,7 @@ namespace AL {
 
 Streamer::Streamer(Source &s):
        src(s),
-       snd(0)
+       decoder(0)
 { }
 
 Streamer::~Streamer()
@@ -27,22 +20,22 @@ Streamer::~Streamer()
                delete *i;
 }
 
-void Streamer::play(Sound &s)
+void Streamer::play(SoundDecoder &s)
 {
-       snd=&s;
+       decoder = &s;
        tick();
        src.play();
 }
 
 void Streamer::stop()
 {
-       snd=0;
+       decoder = 0;
        src.stop();
 }
 
 void Streamer::tick()
 {
-       if(unsigned n=src.get_buffers_processed())
+       if(unsigned n = src.get_buffers_processed())
        {
                for(unsigned i=0; i<n; ++i)
                {
@@ -52,38 +45,38 @@ void Streamer::tick()
                }
        }
 
-       if(!snd)
+       if(!decoder)
                return;
 
        if(src.get_state()!=PLAYING && src.get_state()!=PAUSED)
                src.play();
 
-       unsigned freq=snd->get_frequency();
-       unsigned chunk_size=freq&~0xF;
-       unsigned queued=src.get_buffers_queued();
+       unsigned freq = decoder->get_frequency();
+       unsigned chunk_size = freq&~0xF;
+       unsigned queued = src.get_buffers_queued();
+       vector<char> data(chunk_size);
        for(unsigned i=queued; i<4; ++i)
        {
-               char data[chunk_size];
-               unsigned pos=0;
+               unsigned pos = 0;
                while(pos<chunk_size)
                {
-                       unsigned len=snd->read(data+pos, chunk_size-pos);
+                       unsigned len = decoder->read(&data[0]+pos, chunk_size-pos);
                        if(len==0)
                                break;
-                       pos+=len;
+                       pos += len;
                }
 
                if(pos)
                {
-                       Buffer *buf=new Buffer;
-                       buf->data(snd->get_format(), data, pos, freq);
+                       Buffer *buf = new Buffer;
+                       buf->data(decoder->get_format(), &data[0], pos, freq);
                        src.queue_buffer(*buf);
                        buffers.push_back(buf);
                }
        }
 
-       if(snd->eof())
-               snd=0;
+       if(decoder->eof())
+               decoder = 0;
 }
 
 } // namespace AL