bug: tweak loop delay to fit music rate
This commit is contained in:
@@ -209,7 +209,8 @@ void PlaybackEngine::musicFeedThread() {
|
|||||||
|
|
||||||
int* channel_map = (int*) malloc(num_ch_out * sizeof(int));
|
int* channel_map = (int*) malloc(num_ch_out * sizeof(int));
|
||||||
|
|
||||||
int loop_delay_ms = 1000 * buf_size_samples / playbackRate.load();
|
// initial guess, as long as we do not have a music file (otherwise we should divide by mp3->rate)
|
||||||
|
size_t loop_delay_us = 1000000 * buf_size_samples / playbackRate.load();
|
||||||
|
|
||||||
int idebug = 0;
|
int idebug = 0;
|
||||||
|
|
||||||
@@ -241,8 +242,8 @@ void PlaybackEngine::musicFeedThread() {
|
|||||||
// (is it like double-buffering implemented in 'stretcher'?)
|
// (is it like double-buffering implemented in 'stretcher'?)
|
||||||
|
|
||||||
if (num_samples == 0) {
|
if (num_samples == 0) {
|
||||||
//LOGD("waiting for getSamplesRequired()");
|
LOGD("waiting %d us for getSamplesRequired()", loop_delay_us);
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(loop_delay_ms));
|
std::this_thread::sleep_for(std::chrono::microseconds(loop_delay_us));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,6 +253,7 @@ void PlaybackEngine::musicFeedThread() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!haveMusicFile.load()) {
|
if (!haveMusicFile.load()) {
|
||||||
|
loop_delay_us = 1000000 * num_samples / playbackRate.load();
|
||||||
if(idebug++ < 10) {
|
if(idebug++ < 10) {
|
||||||
LOGI("feed %d silence samples", num_samples);
|
LOGI("feed %d silence samples", num_samples);
|
||||||
// 1024, 512, 512
|
// 1024, 512, 512
|
||||||
@@ -263,6 +265,7 @@ void PlaybackEngine::musicFeedThread() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(idebug++ < 10) {
|
if(idebug++ < 10) {
|
||||||
|
loop_delay_us = 1000000 * num_samples / musicFile->rate;
|
||||||
LOGI("feed %d music samples", num_samples);
|
LOGI("feed %d music samples", num_samples);
|
||||||
// feed 1024 music samples
|
// feed 1024 music samples
|
||||||
// => stretcher is asking for 1024 = getSamplesRequired()
|
// => stretcher is asking for 1024 = getSamplesRequired()
|
||||||
@@ -275,14 +278,17 @@ void PlaybackEngine::musicFeedThread() {
|
|||||||
musicFile->offset = 0; // unused here
|
musicFile->offset = 0; // unused here
|
||||||
if (err != MPG123_OK && err != MPG123_DONE) {
|
if (err != MPG123_OK && err != MPG123_DONE) {
|
||||||
// error!
|
// error!
|
||||||
LOGE("mpg123_read() err=%d done=%d", err, done);
|
LOGE("error reading mp3 file: mpg123_read() err=%d done=%d", err, done);
|
||||||
// next iteration will play silence
|
// next iteration will play silence
|
||||||
closeMusicFile();
|
closeMusicFile();
|
||||||
|
stretcher.setTimeRatio(1.0); // buffer size for playing silence is computed from 'playbackRate', so reset timeRatio
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(err == MPG123_DONE) {
|
if(err == MPG123_DONE) {
|
||||||
// next iteration will play silence
|
// next iteration will play silence
|
||||||
|
LOGI("finished reading mp3 file (MPG123_DONE)");
|
||||||
closeMusicFile();
|
closeMusicFile();
|
||||||
|
stretcher.setTimeRatio(1.0); // buffer size for playing silence is computed from 'playbackRate', so reset timeRatio
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user