diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2014-10-12 21:19:48 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2014-10-12 21:19:48 +0200 |
commit | adc6d371af2cf356578fee6be0711d6db7f31288 (patch) | |
tree | 969a2b081f5089168a798dd945a8e0b287d02f8d /dgedit/player.cc | |
parent | fafc815d3b2f525e703ab9482a008201097ab90d (diff) | |
parent | 32d9c872e7abdaedb497e7403a44470676838ecb (diff) |
Merge in from master.
Diffstat (limited to 'dgedit/player.cc')
-rw-r--r-- | dgedit/player.cc | 190 |
1 files changed, 0 insertions, 190 deletions
diff --git a/dgedit/player.cc b/dgedit/player.cc deleted file mode 100644 index 3a2bfd2..0000000 --- a/dgedit/player.cc +++ /dev/null @@ -1,190 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * player.cc - * - * Tue Apr 15 10:34:18 CEST 2014 - * Copyright 2014 Bent Bisballe Nyeng - * deva@aasimon.org - ****************************************************************************/ - -/* - * This file is part of DrumGizmo. - * - * DrumGizmo is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * DrumGizmo is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with DrumGizmo; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ -#include "player.h" - -#include <math.h> - -#define BUFSZ 512 - -Player::Player() -{ - peak = 0; - pos = 0; - gain_scalar = 1.0; - pcm_data = NULL; - pcm_size = 0; - end = 0; - new_selection = false; - - connect(&report_timer, SIGNAL(timeout()), this, SLOT(reportTimeout())); - report_timer.start(50); // Update 25 times per second - - start(); -} - -Player::~Player() -{ - running = false; // Signal player thread to stop - wait(); // Wait for player thread to stop. -} - -#define _MIN(a, b) (a<b?a:b) -void Player::run() -{ - Selection sel; - - ao_initialize(); - - ao_sample_format sf; - memset(&sf, 0, sizeof(sf)); - sf.bits = 16; - sf.rate = 44100; - sf.channels = 1; - sf.byte_format = AO_FMT_NATIVE; - - dev = ao_open_live(ao_default_driver_id(), &sf, 0); - - running = true; - - short s[BUFSZ]; - while(running) { - - { // Check for new Selection. - QMutexLocker lock(&mutex); - if(new_selection) { - sel = selection; - pos = sel.from; - end = sel_end; - new_selection = false; - } - } - - for(size_t i = 0; i < BUFSZ; i++) { - double sample = 0.0; - size_t p = i + pos; - if(p < sel.to && p < end && p < pcm_size) { - double fade = 1; - if(p < (sel.from + sel.fadein)) { - // Apply linear fade-in - double fp = (double)((int)p - (int)sel.from); - fade = fp / (double)sel.fadeout; - } - - if(p > (sel.to - sel.fadeout)) { - // Apply linear fade-out - double fp = (double)(((int)sel.to - (int)sel.fadeout) - (int)p); - fade = 1 + (fp / (double)sel.fadeout); - } - - sample = pcm_data[p] * fade * gain_scalar; - } - if(fabs(sample) > peak) { - peak = fabs(sample); - } - s[i] = _MIN(sample * SHRT_MAX, SHRT_MAX); - } - - ao_play(dev, (char*)s, BUFSZ * sizeof(short)); - - pos += BUFSZ; - } - - ao_close(dev); - ao_shutdown(); -} - -bool Player::playSelectionDone() -{ - return pos >= sel_end || pos >= selection.to; -} - -void Player::playSelection(Selection s, int len) -{ - { // Enqueue new Selection for player consumation - QMutexLocker lock(&mutex); - - selection = s; - - if(len > 0) sel_end = len; - else sel_end = selection.to - selection.from; - - sel_end += selection.from; - - new_selection = true; - } - - // Wait until player actually consumed the new Selection. - while(new_selection) { - msleep(1); - } -} - -void Player::setGainScalar(double g) -{ - gain_scalar = g; -} - -void Player::setGainDB(double gain_db) -{ - setGainScalar(pow(10, gain_db/ 20.0)); -} - -void Player::reportTimeout() -{ - emit peakUpdate(peak); - emit peakUpdateDB(20 * log10(peak)); - peak = 0.0; - - emit positionUpdate(pos); - peak = 0.0; -} - -void Player::setPcmData(float *data, size_t size) -{ - pcm_data = data; - pcm_size = size; -} - -void Player::setPosition(size_t position) -{ - Selection s; - s.from = position; - s.to = pcm_size; - s.fadein = 0; - s.fadeout = 0; - playSelection(s); -} - -void Player::stop() -{ - Selection s; - s.from = 0; - s.to = 0; - s.fadein = 0; - s.fadeout = 0; - playSelection(s, pos); -} |