summaryrefslogtreecommitdiff
path: root/src/player.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.cc')
-rw-r--r--src/player.cc243
1 files changed, 129 insertions, 114 deletions
diff --git a/src/player.cc b/src/player.cc
index 3a2bfd2..1181841 100644
--- a/src/player.cc
+++ b/src/player.cc
@@ -32,159 +32,174 @@
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();
+ 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.
+ 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();
+ 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;
+ 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);
- }
+ {
+ // 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;
+ gain_scalar = g;
}
void Player::setGainDB(double gain_db)
{
- setGainScalar(pow(10, gain_db/ 20.0));
+ setGainScalar(pow(10, gain_db/ 20.0));
}
void Player::reportTimeout()
{
- emit peakUpdate(peak);
- emit peakUpdateDB(20 * log10(peak));
- peak = 0.0;
+ emit peakUpdate(peak);
+ emit peakUpdateDB(20 * log10(peak));
+ peak = 0.0;
- emit positionUpdate(pos);
- peak = 0.0;
+ emit positionUpdate(pos);
+ peak = 0.0;
}
-void Player::setPcmData(float *data, size_t size)
+void Player::setPcmData(float* data, size_t size)
{
- pcm_data = data;
- pcm_size = 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);
+ 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);
+ Selection s;
+ s.from = 0;
+ s.to = 0;
+ s.fadein = 0;
+ s.fadeout = 0;
+ playSelection(s, pos);
}