SHA256
1
0
forked from pool/alsa-utils
alsa-utils/0002-alsaloop-libsamplerate-requires-specific-formats-for.patch

62 lines
1.8 KiB
Diff
Raw Normal View History

From 3853175d122ef368db1f653140502ec44d4b2a4a Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 7 Mar 2011 14:21:19 +0100
Subject: [PATCH 02/16] alsaloop: libsamplerate requires specific formats,
force them for slave mode
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
alsaloop/pcmjob.c | 22 ++++++++++++++++++++--
1 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/alsaloop/pcmjob.c b/alsaloop/pcmjob.c
index 0b84803..6b50cf0 100644
--- a/alsaloop/pcmjob.c
+++ b/alsaloop/pcmjob.c
@@ -1238,8 +1238,8 @@ static int closeit(struct loopback_handle *lhandle)
static int init_handle(struct loopback_handle *lhandle, int alloc)
{
snd_pcm_uframes_t lat;
- lhandle->frame_size = (snd_pcm_format_width(lhandle->format) / 8) *
- lhandle->channels;
+ lhandle->frame_size = (snd_pcm_format_physical_width(lhandle->format)
+ / 8) * lhandle->channels;
lhandle->sync_point = lhandle->rate * 15; /* every 15 seconds */
lat = lhandle->loopback->latency;
if (lhandle->buffer_size > lat)
@@ -1358,6 +1358,23 @@ static void lhandle_start(struct loopback_handle *lhandle)
lhandle->total_queued = 0;
}
+static void fix_format(struct loopback *loop)
+{
+ snd_pcm_format_t format = loop->capt->format;
+
+ if (loop->sync != SYNC_TYPE_SAMPLERATE)
+ return;
+ if (format == SND_PCM_FORMAT_S16 ||
+ format == SND_PCM_FORMAT_S32)
+ return;
+ if (snd_pcm_format_width(format) > 16)
+ format = SND_PCM_FORMAT_S32;
+ else
+ format = SND_PCM_FORMAT_S16;
+ loop->capt->format = format;
+ loop->play->format = format;
+}
+
int pcmjob_start(struct loopback *loop)
{
snd_pcm_uframes_t count;
@@ -1383,6 +1400,7 @@ int pcmjob_start(struct loopback *loop)
if (err < 0)
goto __error;
loop->play->format = loop->capt->format = err;
+ fix_format(loop);
err = get_rate(loop->capt);
if (err < 0)
goto __error;
--
1.7.5.3