From c22a53d373f840569c56a1b3f6a774fc94b1e1e1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 1 Aug 2006 10:07:07 +0000 Subject: audio: remove AUDIO_MAX_DEVICES limit Some people have more than 8 devices (the old limit). It's pretty easy to support as many as our hardware and OS allows so we might as well. git-svn-id: https://svn.musicpd.org/mpd/trunk@4513 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/audio.c | 45 ++++++++++++++++++++++++--------------------- src/audio.h | 4 ++-- src/playerData.c | 6 ++++++ src/playerData.h | 2 +- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/audio.c b/src/audio.c index b4f0dadc3..04c38716b 100644 --- a/src/audio.c +++ b/src/audio.c @@ -49,7 +49,7 @@ static mpd_uint8 audioOutputArraySize = 0; /* the audioEnabledArray should be stuck into shared memory, and then disable and enable in playAudio() routine */ static mpd_sint8 *pdAudioDevicesEnabled = NULL; -static mpd_sint8 myAudioDevicesEnabled[AUDIO_MAX_DEVICES]; +static mpd_sint8 *myAudioDevicesEnabled = NULL; static mpd_uint8 audioOpened = 0; @@ -57,6 +57,18 @@ static mpd_sint32 audioBufferSize = 0; static char *audioBuffer = NULL; static mpd_sint32 audioBufferPos = 0; +size_t audio_device_count(void) +{ + size_t nr = 0; + ConfigParam *param = NULL; + + while ((param = getNextConfigParam(CONF_AUDIO_OUTPUT, param))) + nr++; + if (!nr) + nr = 1; /* we'll always have at least one device */ + return nr; +} + void copyAudioFormat(AudioFormat * dest, AudioFormat * src) { if (!src) @@ -101,31 +113,21 @@ void initAudioDriver(void) loadAudioDrivers(); + audioOutputArraySize = audio_device_count(); pdAudioDevicesEnabled = (getPlayerData())->audioDeviceEnabled; + audioOutputArray = malloc(sizeof(AudioOutput *) * audioOutputArraySize); + myAudioDevicesEnabled = malloc(sizeof(mpd_sint8)*audioOutputArraySize); - for (i = 0; i < AUDIO_MAX_DEVICES; i++) { - pdAudioDevicesEnabled[i] = 1; - myAudioDevicesEnabled[i] = 1; - } + for (i = 0; i < audioOutputArraySize; i++) + myAudioDevicesEnabled[i] = pdAudioDevicesEnabled[i] = 1; + i = 0; param = getNextConfigParam(CONF_AUDIO_OUTPUT, param); do { AudioOutput *output; int j; - if (audioOutputArraySize == AUDIO_MAX_DEVICES) { - ERROR("only up to 255 audio output devices are " - "supported"); - exit(EXIT_FAILURE); - } - - i = audioOutputArraySize++; - - audioOutputArray = realloc(audioOutputArray, - audioOutputArraySize * - sizeof(AudioOutput *)); - output = newAudioOutput(param); if (!output && param) { ERROR("problems configuring output device defined at " @@ -141,7 +143,7 @@ void initAudioDriver(void) exit(EXIT_FAILURE); } } - audioOutputArray[i] = output; + audioOutputArray[i++] = output; } while ((param = getNextConfigParam(CONF_AUDIO_OUTPUT, param))); } @@ -271,7 +273,8 @@ static void syncAudioDevicesEnabledArrays(void) { int i; - memcpy(myAudioDevicesEnabled, pdAudioDevicesEnabled, AUDIO_MAX_DEVICES); + memcpy(myAudioDevicesEnabled, pdAudioDevicesEnabled, + audioOutputArraySize); for (i = 0; i < audioOutputArraySize; i++) { if (myAudioDevicesEnabled[i]) { @@ -292,7 +295,7 @@ static int flushAudioBuffer(void) return 0; if (0 != memcmp(pdAudioDevicesEnabled, myAudioDevicesEnabled, - AUDIO_MAX_DEVICES)) { + audioOutputArraySize)) { syncAudioDevicesEnabledArrays(); } @@ -385,7 +388,7 @@ void dropBufferedAudio(void) int i; if (0 != memcmp(pdAudioDevicesEnabled, myAudioDevicesEnabled, - AUDIO_MAX_DEVICES)) { + audioOutputArraySize)) { syncAudioDevicesEnabledArrays(); } diff --git a/src/audio.h b/src/audio.h index 70cc551fd..7a811d9db 100644 --- a/src/audio.h +++ b/src/audio.h @@ -28,14 +28,14 @@ #define AUDIO_AO_DRIVER_DEFAULT "default" -#define AUDIO_MAX_DEVICES 8 - typedef struct _AudioFormat { volatile mpd_sint8 channels; volatile mpd_uint32 sampleRate; volatile mpd_sint8 bits; } AudioFormat; +size_t audio_device_count(void); + void copyAudioFormat(AudioFormat * dest, AudioFormat * src); int cmpAudioFormat(AudioFormat * dest, AudioFormat * src); diff --git a/src/playerData.c b/src/playerData.c index b5f8aadd4..f566b5c79 100644 --- a/src/playerData.c +++ b/src/playerData.c @@ -45,6 +45,7 @@ void initPlayerData(void) size_t allocationSize; OutputBuffer *buffer; ConfigParam *param; + size_t device_array_size = audio_device_count() * sizeof(mpd_sint8); param = getConfigParam(CONF_AUDIO_BUFFER_SIZE); @@ -91,6 +92,9 @@ void initPlayerData(void) allocationSize += buffered_chunks * sizeof(mpd_sint8); /*for metaChunk */ allocationSize += sizeof(PlayerData); /*for playerData struct */ + /* for audioDeviceEnabled[] */ + allocationSize += device_array_size; + if ((shmid = shmget(IPC_PRIVATE, allocationSize, IPC_CREAT | 0600)) < 0) { ERROR("problems shmget'ing\n"); exit(EXIT_FAILURE); @@ -104,6 +108,8 @@ void initPlayerData(void) exit(EXIT_FAILURE); } + playerData_pd->audioDeviceEnabled = (char *)playerData_pd + + allocationSize - device_array_size; buffer = &(playerData_pd->buffer); buffer->chunks = ((char *)playerData_pd) + sizeof(PlayerData); diff --git a/src/playerData.h b/src/playerData.h index ac64f3b85..2e1e445be 100644 --- a/src/playerData.h +++ b/src/playerData.h @@ -37,7 +37,7 @@ typedef struct _PlayerData { OutputBuffer buffer; PlayerControl playerControl; DecoderControl decoderControl; - mpd_sint8 audioDeviceEnabled[AUDIO_MAX_DEVICES]; + mpd_sint8 *audioDeviceEnabled; int pid; } PlayerData; -- cgit v1.2.3