desktop/tvtime/tvtime-1.0.2-alsa-fixes.patch

144 lines
4.2 KiB
Diff

diff -Naur a/src/audiolib.c b/src/audiolib.c
--- a/src/audiolib.c 2010-05-06 12:07:34.000000000 +0200
+++ b/src/audiolib.c 2010-05-06 12:08:06.000000000 +0200
@@ -74,6 +74,7 @@
struct alsa_device *alsa_open(char *input, char *output, unsigned long format, int channels, unsigned int rate)
{
int result;
+ int rv;
struct alsa_device *dev = malloc(sizeof(struct alsa_device));
dev->fmt.format = format;
@@ -93,17 +94,27 @@
// snd_pcm_nonblock( dev->playback, 1);
- alsa_set_params(dev->playback, &dev->fmt, 0);
+ rv = alsa_set_params(dev->playback, &dev->fmt, 0);
+ if (rv == -1) {
+ snd_pcm_close(dev->playback);
+ return NULL;
+ }
if ((result = snd_pcm_open( &dev->capture, input, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK))<0)
{
+ snd_pcm_close(dev->playback);
free(dev);
return NULL;
}
// snd_pcm_nonblock(dev->playback, 1);
- alsa_set_params(dev->capture, &dev->fmt, 1);
+ rv = alsa_set_params(dev->capture, &dev->fmt, 1);
+ if (rv == -1) {
+ snd_pcm_close(dev->playback);
+ snd_pcm_close(dev->capture);
+ return NULL;
+ }
return dev;
}
@@ -212,8 +223,8 @@
snd_pcm_sw_params_alloca(&swparams);
err = snd_pcm_hw_params_any(handle, params);
if (err < 0) {
- printf("Broken configuration for this PCM: no configurations available");
- exit(EXIT_FAILURE);
+ printf("Broken configuration for this PCM: no configurations available\n");
+ return -1;
}
@@ -223,18 +234,18 @@
err = snd_pcm_hw_params_set_access_mask(handle, params, mask);
if (err < 0) {
- printf("Access type not available");
- exit(EXIT_FAILURE);
+ printf("Access type not available\n");
+ return -1;
}
err = snd_pcm_hw_params_set_format(handle, params, fmt->format);
if (err < 0) {
- printf("Sample format non available");
- exit(EXIT_FAILURE);
+ printf("Sample format non available\n");
+ return -1;
}
err = snd_pcm_hw_params_set_channels(handle, params, fmt->channels);
if (err < 0) {
- printf("Channels count non available");
- exit(EXIT_FAILURE);
+ printf("Channels count non available\n");
+ return -1;
}
rate = fmt->rate;
@@ -277,22 +288,22 @@
assert(err >= 0);
err = snd_pcm_hw_params(handle, params);
if (err < 0) {
- printf("Unable to install hw params");
- return -EINVAL;
+ printf("Unable to install hw params\n");
+ return -1;
}
snd_pcm_hw_params_get_period_size(params, &chunk_size, 0);
snd_pcm_hw_params_get_buffer_size(params, &buffer_size);
if (chunk_size == buffer_size) {
- printf("Can't use period equal to buffer size (%lu == %lu)", chunk_size, buffer_size);
- return -EINVAL;
+ printf("Can't use period equal to buffer size (%lu == %lu)\n", chunk_size, buffer_size);
+ return -1;
}
snd_pcm_sw_params_current(handle, swparams);
err = snd_pcm_sw_params_get_xfer_align(swparams, &xfer_align);
if (err < 0) {
printf("Unable to obtain xfer align\n");
- exit(EXIT_FAILURE);
+ return -1;
}
err = snd_pcm_sw_params_set_sleep_min(handle, swparams, 0);
@@ -331,8 +342,8 @@
assert(err >= 0);
if (snd_pcm_sw_params(handle, swparams) < 0) {
- printf("unable to install sw params");
- return -EINVAL;
+ printf("unable to install sw params\n");
+ return -1;
}
fmt->bits_per_sample = snd_pcm_format_physical_width(fmt->format);
diff -Naur a/src/tvtime.c b/src/tvtime.c
--- a/src/tvtime.c 2010-05-06 12:07:34.000000000 +0200
+++ b/src/tvtime.c 2010-05-06 12:08:06.000000000 +0200
@@ -1184,6 +1184,7 @@
char prevloc[ 256 ];
char *empia_device;
int i;
+ int audio_state = 0;
ct = config_new();
if( !ct ) {
@@ -2061,10 +2062,14 @@
session.
*/
- if (empia_device && videoinput_get_audio(vidin) == NULL) {
+ if (empia_device && audio_state == 0 && videoinput_get_audio(vidin) == NULL) {
videoinput_set_audio(vidin, alsa_open(empia_device, "default", SND_PCM_FORMAT_S16_LE, 2 /* 2 channels */, 48000 /* rate */));
if (videoinput_get_audio(vidin)) {
+ audio_state = 0;
+ printf("starting alsa transfer\n");
alsa_start_threaded_loop(videoinput_get_audio(vidin));
+ } else {
+ audio_state = -1;
}
}