mirror of
https://gitdl.cn/https://github.com/chakralinux/desktop.git
synced 2025-02-03 07:57:14 +08:00
144 lines
4.2 KiB
Diff
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;
|
|
}
|
|
}
|
|
|