32
32
* as that of the covered work.
35
39
#include "audioloop.h"
37
#include "dbus/callmanager.h"
42
45
#include "logger.h"
44
AudioLoop::AudioLoop(unsigned int sampleRate) : buffer_(0), size_(0), pos_(0), sampleRate_(sampleRate), isRecording_(false)
47
AudioLoop::AudioLoop(unsigned int sampleRate) :
48
buffer_(new AudioBuffer(0, 1, sampleRate)), pos_(0)
47
51
AudioLoop::~AudioLoop()
53
57
AudioLoop::seek(double relative_position)
55
size_t new_pos = (size_t)((double)size_ * (relative_position * 0.01));
59
pos_ = static_cast<double>(buffer_->frames() * relative_position * 0.01);
60
static unsigned int updatePlaybackScale = 0;
63
AudioLoop::getNext(SFLDataFormat* output, size_t total_samples, short volume)
63
AudioLoop::getNext(AudioBuffer& output, double gain)
66
ERROR("buffer is NULL");
70
const size_t buf_samples = buffer_->frames();
72
size_t total_samples = output.frames();
73
size_t output_pos = 0;
75
if (buf_samples == 0) {
68
76
ERROR("Audio loop size is 0");
70
} else if (pos >= size_) {
78
} else if (pos >= buf_samples) {
71
79
ERROR("Invalid loop position %d", pos);
75
83
while (total_samples > 0) {
76
size_t samples = total_samples;
78
if (samples > (size_ - pos))
79
samples = size_ - pos;
81
// short->char conversion
82
memcpy(output, buffer_ + pos, samples * sizeof(SFLDataFormat));
86
const double gain = volume * 0.01;
88
for (size_t i = 0; i < samples; ++i, ++output)
91
output += samples; // this is the destination...
93
pos = (pos + samples) % size_;
84
size_t samples = std::min(total_samples, buf_samples - pos);
86
output.copy(*buffer_, samples, pos, output_pos);
88
output_pos += samples;
89
pos = (pos + samples) % buf_samples;
95
91
total_samples -= samples;
94
output.applyGain(gain);
100
// We want to send values in milisecond
101
int divisor = sampleRate_ / 1000;
103
ERROR("Error cannot update playback slider, sampling rate is 0");
108
if((updatePlaybackScale % 5) == 0) {
109
CallManager *cm = Manager::instance().getDbusManager()->getCallManager();
110
cm->updatePlaybackScale(pos_ / divisor, size_ / divisor);
112
updatePlaybackScale++;
101
void AudioLoop::onBufferFinish() {}