annotate stream/ai_alsa1x.c @ 29946:54bacf6a38ca

Update the SuperH VEU vidix driver with code that calls fsync() after each frame to make sure the frame is flushed in case of deferred io. Patch by Magnus Damm, damm opensource se
author cehoyos
date Thu, 10 Dec 2009 23:16:08 +0000
parents 0f1b5b68af32
children ce0122361a39
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7213
13fcab6fde41 audio in layer is used only bu tvi_v4l, don't compile for others.
arpi
parents: 7070
diff changeset
1 #include <stdio.h>
13fcab6fde41 audio in layer is used only bu tvi_v4l, don't compile for others.
arpi
parents: 7070
diff changeset
2 #include <stdlib.h>
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
3 #include <sys/time.h>
27281
e47193172586 Our ALSA code needs alloca, so check for it in configure and include alloca.h
reimar
parents: 24831
diff changeset
4 #include <alloca.h>
7213
13fcab6fde41 audio in layer is used only bu tvi_v4l, don't compile for others.
arpi
parents: 7070
diff changeset
5
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
6 #include "config.h"
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
7
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
8 #include <alsa/asoundlib.h>
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
9 #include "audio_in.h"
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
10 #include "mp_msg.h"
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 11775
diff changeset
11 #include "help_mp.h"
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
12
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
13 int ai_alsa_setup(audio_in_t *ai)
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
14 {
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
15 snd_pcm_hw_params_t *params;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
16 snd_pcm_sw_params_t *swparams;
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
17 snd_pcm_uframes_t buffer_size, period_size;
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
18 int err;
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
19 int dir;
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
20 unsigned int rate;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
21
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
22 snd_pcm_hw_params_alloca(&params);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
23 snd_pcm_sw_params_alloca(&swparams);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
24
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
25 err = snd_pcm_hw_params_any(ai->alsa.handle, params);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
26 if (err < 0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
27 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_PcmBrokenConfig);
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
28 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
29 }
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
30
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
31 err = snd_pcm_hw_params_set_access(ai->alsa.handle, params,
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
32 SND_PCM_ACCESS_RW_INTERLEAVED);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
33 if (err < 0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
34 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_UnavailableAccessType);
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
35 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
36 }
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
37
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
38 err = snd_pcm_hw_params_set_format(ai->alsa.handle, params, SND_PCM_FORMAT_S16_LE);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
39 if (err < 0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
40 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_UnavailableSampleFmt);
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
41 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
42 }
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
43
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
44 err = snd_pcm_hw_params_set_channels(ai->alsa.handle, params, ai->req_channels);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
45 if (err < 0) {
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
46 snd_pcm_hw_params_get_channels(params, &ai->channels);
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
47 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_UnavailableChanCount,
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
48 ai->channels);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
49 } else {
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
50 ai->channels = ai->req_channels;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
51 }
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
52
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
53 dir = 0;
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
54 rate = ai->req_samplerate;
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
55 err = snd_pcm_hw_params_set_rate_near(ai->alsa.handle, params, &rate, &dir);
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
56 if (err < 0) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 11775
diff changeset
57 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA1X_CannotSetSamplerate);
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
58 }
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
59 ai->samplerate = rate;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
60
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
61 dir = 0;
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
62 ai->alsa.buffer_time = 1000000;
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
63 err = snd_pcm_hw_params_set_buffer_time_near(ai->alsa.handle, params,
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
64 &ai->alsa.buffer_time, &dir);
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
65 if (err < 0) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 11775
diff changeset
66 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA1X_CannotSetBufferTime);
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
67 }
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
68
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
69 dir = 0;
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
70 ai->alsa.period_time = ai->alsa.buffer_time / 4;
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
71 err = snd_pcm_hw_params_set_period_time_near(ai->alsa.handle, params,
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
72 &ai->alsa.period_time, &dir);
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
73 if (err < 0) {
16882
dfbe8cd0e081 libmpdemux translatables to help_mp part 1 / mp_msg calls / try 2
reynaldo
parents: 11775
diff changeset
74 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA1X_CannotSetPeriodTime);
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
75 }
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
76
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
77 err = snd_pcm_hw_params(ai->alsa.handle, params);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
78 if (err < 0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
79 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_CannotInstallHWParams, snd_strerror(err));
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
80 snd_pcm_hw_params_dump(params, ai->alsa.log);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
81 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
82 }
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
83
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
84 dir = -1;
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
85 snd_pcm_hw_params_get_period_size(params, &period_size, &dir);
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
86 snd_pcm_hw_params_get_buffer_size(params, &buffer_size);
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
87 ai->alsa.chunk_size = period_size;
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
88 if (period_size == buffer_size) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
89 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_PeriodEqualsBufferSize, ai->alsa.chunk_size, (long)buffer_size);
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
90 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
91 }
11775
66e491c35dc8 ALSA 1.x audio out driver
henry
parents: 10537
diff changeset
92
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
93 snd_pcm_sw_params_current(ai->alsa.handle, swparams);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
94 err = snd_pcm_sw_params_set_sleep_min(ai->alsa.handle, swparams,0);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
95 err = snd_pcm_sw_params_set_avail_min(ai->alsa.handle, swparams, ai->alsa.chunk_size);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
96
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
97 err = snd_pcm_sw_params_set_start_threshold(ai->alsa.handle, swparams, 0);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
98 err = snd_pcm_sw_params_set_stop_threshold(ai->alsa.handle, swparams, buffer_size);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
99
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
100 if (snd_pcm_sw_params(ai->alsa.handle, swparams) < 0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
101 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_CannotInstallSWParams);
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
102 snd_pcm_sw_params_dump(swparams, ai->alsa.log);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
103 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
104 }
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
105
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
106 if (mp_msg_test(MSGT_TV, MSGL_V)) {
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
107 snd_pcm_dump(ai->alsa.handle, ai->alsa.log);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
108 }
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
109
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
110 ai->alsa.bits_per_sample = snd_pcm_format_physical_width(SND_PCM_FORMAT_S16_LE);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
111 ai->alsa.bits_per_frame = ai->alsa.bits_per_sample * ai->channels;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
112 ai->blocksize = ai->alsa.chunk_size * ai->alsa.bits_per_frame / 8;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
113 ai->samplesize = ai->alsa.bits_per_sample;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
114 ai->bytes_per_sample = ai->alsa.bits_per_sample/8;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
115
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
116 return 0;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
117 }
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
118
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
119 int ai_alsa_init(audio_in_t *ai)
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
120 {
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
121 int err;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27281
diff changeset
122
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
123 err = snd_pcm_open(&ai->alsa.handle, ai->alsa.device, SND_PCM_STREAM_CAPTURE, 0);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
124 if (err < 0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
125 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_ErrorOpeningAudio, snd_strerror(err));
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
126 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
127 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27281
diff changeset
128
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
129 err = snd_output_stdio_attach(&ai->alsa.log, stderr, 0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27281
diff changeset
130
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
131 if (err < 0) {
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
132 return -1;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
133 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27281
diff changeset
134
7060
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
135 err = ai_alsa_setup(ai);
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
136
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
137 return err;
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
138 }
b14880a6cccb new v4l capture patch by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>:
arpi
parents:
diff changeset
139
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
140 #ifndef timersub
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
141 #define timersub(a, b, result) \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
142 do { \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
143 (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
144 (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
145 if ((result)->tv_usec < 0) { \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
146 --(result)->tv_sec; \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
147 (result)->tv_usec += 1000000; \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
148 } \
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
149 } while (0)
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
150 #endif
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
151
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
152 int ai_alsa_xrun(audio_in_t *ai)
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
153 {
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
154 snd_pcm_status_t *status;
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
155 int res;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27281
diff changeset
156
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
157 snd_pcm_status_alloca(&status);
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
158 if ((res = snd_pcm_status(ai->alsa.handle, status))<0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
159 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_AlsaStatusError, snd_strerror(res));
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
160 return -1;
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
161 }
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
162 if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) {
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
163 struct timeval now, diff, tstamp;
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
164 gettimeofday(&now, 0);
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
165 snd_pcm_status_get_trigger_tstamp(status, &tstamp);
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
166 timersub(&now, &tstamp, &diff);
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
167 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_AlsaXRUN,
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
168 diff.tv_sec * 1000 + diff.tv_usec / 1000.0);
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
169 if (mp_msg_test(MSGT_TV, MSGL_V)) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
170 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_AlsaStatus);
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
171 snd_pcm_status_dump(status, ai->alsa.log);
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
172 }
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
173 if ((res = snd_pcm_prepare(ai->alsa.handle))<0) {
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
174 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_AlsaXRUNPrepareError, snd_strerror(res));
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
175 return -1;
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
176 }
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
177 return 0; /* ok, data should be accepted again */
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
178 }
16905
c3762297a9d1 changes from MSGTR_MPDEMUX_AIALSA1X_* to MSGTR_MPDEMUX_AIALSA_* since they are the same messages
ptt
parents: 16882
diff changeset
179 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIALSA_AlsaReadWriteError);
7586
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
180 return -1;
d12421dd1265 this patch adds an ability to recover from audio buffer cross-run by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
alex
parents: 7213
diff changeset
181 }