arts: backed out audio capture support. Turns out that libartsc isn't thread-safe, so if we run a capture and playback device at the same time, it often crashes in arts's internal event loop. We could throw mutexes around the read/write calls, but these are meant to block, so one device could cause serious latency and stutter in the other. Since this audio target isn't in high-demand (Ubuntu hasn't offered a libartsc package for years), I'm just backing out the capture support. If someone needs it, they can pull it out of the revision history.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
diff --git a/src/audio/arts/SDL_artsaudio.c b/src/audio/arts/SDL_artsaudio.c
index 1ab7c2d..5d40cd1 100644
--- a/src/audio/arts/SDL_artsaudio.c
+++ b/src/audio/arts/SDL_artsaudio.c
@@ -54,16 +54,12 @@ static void (*SDL_NAME(arts_free)) (void);
static arts_stream_t(*SDL_NAME(arts_play_stream)) (int rate, int bits,
int channels,
const char *name);
-static arts_stream_t(*SDL_NAME(arts_record_stream)) (int rate, int bits,
- int channels,
- const char *name);
static int (*SDL_NAME(arts_stream_set)) (arts_stream_t s,
arts_parameter_t param, int value);
static int (*SDL_NAME(arts_stream_get)) (arts_stream_t s,
arts_parameter_t param);
static int (*SDL_NAME(arts_write)) (arts_stream_t s, const void *buffer,
int count);
-static int (*SDL_NAME(arts_read)) (arts_stream_t s, void *buffer, int count);
static void (*SDL_NAME(arts_close_stream)) (arts_stream_t s);
static int (*SDL_NAME(arts_suspend))(void);
static int (*SDL_NAME(arts_suspended)) (void);
@@ -79,11 +75,9 @@ static struct
SDL_ARTS_SYM(arts_init),
SDL_ARTS_SYM(arts_free),
SDL_ARTS_SYM(arts_play_stream),
- SDL_ARTS_SYM(arts_record_stream),
SDL_ARTS_SYM(arts_stream_set),
SDL_ARTS_SYM(arts_stream_get),
SDL_ARTS_SYM(arts_write),
- SDL_ARTS_SYM(arts_read),
SDL_ARTS_SYM(arts_close_stream),
SDL_ARTS_SYM(arts_suspend),
SDL_ARTS_SYM(arts_suspended),
@@ -205,27 +199,6 @@ ARTS_GetDeviceBuf(_THIS)
return (this->hidden->mixbuf);
}
-static int
-ARTS_CaptureFromDevice(_THIS, void *buffer, int buflen)
-{
- return SDL_NAME(arts_read) (this->hidden->stream, buffer, buflen);
-}
-
-static void
-ARTS_FlushCapture(_THIS)
-{
- arts_stream_t stream = this->hidden->stream;
- int remain = SDL_NAME(arts_stream_get)(stream, ARTS_P_BUFFER_SPACE);
- Uint8 buf[512];
- while (remain > 0) {
- const int len = SDL_min(sizeof (buf), remain);
- const int br = SDL_NAME(arts_read)(stream, buf, len);
- if (br <= 0) {
- return; /* oh well. */
- }
- remain -= br;
- }
-}
static void
ARTS_CloseDevice(_THIS)
@@ -305,20 +278,19 @@ ARTS_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)
SDL_NAME(arts_error_text) (rc));
}
- if (iscapture) {
- this->hidden->stream = SDL_NAME(arts_record_stream) (this->spec.freq,
- bits,
- this->spec.channels,
- "SDL");
- } else {
- this->hidden->stream = SDL_NAME(arts_play_stream) (this->spec.freq,
- bits,
- this->spec.channels,
- "SDL");
- /* Play nothing so we have at least one write (server bug workaround). */
- SDL_NAME(arts_write) (this->hidden->stream, "", 0);
+ if (!ARTS_Suspend()) {
+ ARTS_CloseDevice(this);
+ return SDL_SetError("ARTS can not open audio device");
}
+ this->hidden->stream = SDL_NAME(arts_play_stream) (this->spec.freq,
+ bits,
+ this->spec.channels,
+ "SDL");
+
+ /* Play nothing so we have at least one write (server bug workaround). */
+ SDL_NAME(arts_write) (this->hidden->stream, "", 0);
+
/* Calculate the final parameters for this audio specification */
SDL_CalculateAudioSpec(&this->spec);
@@ -397,12 +369,7 @@ ARTS_Init(SDL_AudioDriverImpl * impl)
impl->CloseDevice = ARTS_CloseDevice;
impl->WaitDone = ARTS_WaitDone;
impl->Deinitialize = ARTS_Deinitialize;
- impl->CaptureFromDevice = ARTS_CaptureFromDevice;
- impl->FlushCapture = ARTS_FlushCapture;
-
impl->OnlyHasDefaultOutputDevice = 1;
- impl->OnlyHasDefaultInputDevice = 1;
- impl->HasCaptureSupport = 1;
return 1; /* this audio target is available. */
}