diff options
Diffstat (limited to 'src/soundplayer.cc')
-rw-r--r-- | src/soundplayer.cc | 158 |
1 files changed, 80 insertions, 78 deletions
diff --git a/src/soundplayer.cc b/src/soundplayer.cc index c59e84e..e5feebc 100644 --- a/src/soundplayer.cc +++ b/src/soundplayer.cc @@ -34,101 +34,103 @@ SoundPlayer::SoundPlayer() { - start(); + start(); } SoundPlayer::~SoundPlayer() { - running = false; + running = false; wait(); } void SoundPlayer::run() { - - printf("SoundPlayer running\n"); - - ao_initialize(); - - ao_sample_format sf; - memset(&sf, 0, sizeof(sf)); - sf.bits = 16; - sf.rate = 44100; - sf.channels = 2; - sf.byte_format = AO_FMT_NATIVE; - - ao_device *dev = ao_open_live(ao_default_driver_id(), &sf, 0); - - running = true; - - short s[BUFSZ]; - while(running) { - - { // Check for new Selection. - QMutexLocker lock(&mutex); - while(queue.size()) { - printf(" - New sound\n"); - active.append(queue.front()); - queue.pop_front(); - } - } - - memset(s, 0, BUFSZ * sizeof(short)); - - QList<QueueItem>::iterator it = active.begin(); - while(it != active.end()) { - QueueItem &item = *it; - - for(size_t i = 0; i < BUFSZ; i++) { - if(item.pos >= item.size) { - it = active.erase(it); - goto nextitem; - } - s[i] += item.samples[item.pos] * 32536; - item.pos++; - } - - it++; - - nextitem: - int a = 1;(void)a; - } - - ao_play(dev, (char*)s, BUFSZ * sizeof(short)); - } - - ao_close(dev); - ao_shutdown(); + printf("SoundPlayer running\n"); + + ao_initialize(); + + ao_sample_format sf; + memset(&sf, 0, sizeof(sf)); + sf.bits = 16; + sf.rate = 44100; + sf.channels = 2; + sf.byte_format = AO_FMT_NATIVE; + + ao_device *dev = ao_open_live(ao_default_driver_id(), &sf, 0); + + running = true; + + short s[BUFSZ]; + while(running) + { + { // Check for new Selection. + QMutexLocker lock(&mutex); + while(queue.size()) + { + printf(" - New sound\n"); + active.append(queue.front()); + queue.pop_front(); + } + } + + memset(s, 0, BUFSZ * sizeof(short)); + + QList<QueueItem>::iterator it = active.begin(); + while(it != active.end()) + { + QueueItem &item = *it; + + for(size_t i = 0; i < BUFSZ; i++) + { + if(item.pos >= item.size) + { + it = active.erase(it); + goto nextitem; + } + s[i] += item.samples[item.pos] * 32536 * 0.5; + item.pos++; + } + + it++; + + nextitem: + int a = 1;(void)a; + } + + ao_play(dev, (char*)s, BUFSZ * sizeof(short)); + } + + ao_close(dev); + ao_shutdown(); } void SoundPlayer::playFile(QString file) { + printf(" - playFile(%s)\n", file.toStdString().c_str()); - printf(" - playFile(%s)\n", file.toStdString().c_str()); - - SNDFILE *fh; - SF_INFO sf_info; + SNDFILE *fh; + SF_INFO sf_info; - fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info); - if(!fh) { - printf("Load error '%s'\n", file.toStdString().c_str()); - return; - } - - size_t size = sf_info.frames * sf_info.channels; - float *data = new float[size]; - sf_read_float(fh, data, size); + fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info); + if(!fh) + { + printf("Load error '%s'\n", file.toStdString().c_str()); + return; + } - sf_close(fh); + size_t size = sf_info.frames * sf_info.channels; + float *data = new float[size]; + sf_read_float(fh, data, size); - QueueItem qi; - qi.samples = data; - qi.pos = 0; - qi.size = size; + sf_close(fh); - { - QMutexLocker lock(&mutex); - queue.append(qi); - } + QueueItem qi; + qi.samples = data; + qi.pos = 0; + qi.size = size; + { + QMutexLocker lock(&mutex); + queue.append(qi); + } } |