mirror of
https://github.com/outbackdingo/UltraGrid.git
synced 2026-03-22 07:40:24 +00:00
alsa: playback: Fix silence when bps == 1
Cannot reuse the same buffer for silence, because in audio_play_alsa_write_frame() it gets converted from signed to unsigned. If the frame is reused it causes alternation between 0 and -127, causing a loud square wave to be played.
This commit is contained in:
@@ -178,16 +178,13 @@ static void *worker(void *args) {
|
||||
.ch_count = s->desc.ch_count };
|
||||
|
||||
size_t len = f.bps * f.ch_count * (f.sample_rate * s->sched_latency_ms / 1000);
|
||||
char *silence = alloca(len);
|
||||
memset(silence, 0, len);
|
||||
char *data = alloca(len);
|
||||
|
||||
#ifdef USE_SPEEX_JITTER_BUFFER
|
||||
const int pkt_max_len = s->desc.sample_rate / 10;
|
||||
JitterBufferPacket pkt;
|
||||
pkt.len = pkt_max_len;
|
||||
pkt.data = alloca(pkt_max_len);
|
||||
#else
|
||||
char *data = alloca(len);
|
||||
#endif
|
||||
while (1) {
|
||||
pthread_mutex_lock(&s->lock);
|
||||
@@ -216,8 +213,9 @@ static void *worker(void *args) {
|
||||
JITTER_BUFFER_INTERNAL_ERROR ? "internal error" :
|
||||
"invalid argument\n");
|
||||
}
|
||||
memset(data, 0, len);
|
||||
f.data_len = len;
|
||||
f.data = silence;
|
||||
f.data = data;
|
||||
}
|
||||
pkt.len = pkt_max_len;
|
||||
#else
|
||||
@@ -229,8 +227,9 @@ static void *worker(void *args) {
|
||||
f.data = data;
|
||||
s->last_audio_read = now;
|
||||
} else {
|
||||
memset(data, 0, len);
|
||||
f.data_len = len;
|
||||
f.data = silence;
|
||||
f.data = data;
|
||||
|
||||
if (tv_diff(now, s->last_audio_read) < 2.0) {
|
||||
log_msg(LOG_LEVEL_VERBOSE, MOD_NAME "empty buffer\n");
|
||||
|
||||
Reference in New Issue
Block a user