diff --git a/src/audio.h b/src/audio.h index 3981212..ad485fa 100644 --- a/src/audio.h +++ b/src/audio.h @@ -1,7 +1,7 @@ /* * This file is part of Moonlight Embedded. * - * Copyright (C) 2015 Iwan Timmer + * Copyright (C) 2015-2017 Iwan Timmer * * Moonlight is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,10 @@ #include +#define MAX_CHANNEL_COUNT 6 +#define FRAME_SIZE 240 +#define FRAME_BUFFER 12 + extern const char* audio_device; extern AUDIO_RENDERER_CALLBACKS audio_callbacks_alsa; diff --git a/src/audio/alsa.c b/src/audio/alsa.c index 273ce82..dfbe98e 100644 --- a/src/audio/alsa.c +++ b/src/audio/alsa.c @@ -1,7 +1,7 @@ /* * This file is part of Moonlight Embedded. * - * Copyright (C) 2015, 2016 Iwan Timmer + * Copyright (C) 2015-2017 Iwan Timmer * * Moonlight is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,16 +25,13 @@ #define CHECK_RETURN(f) if ((rc = f) < 0) { printf("Alsa error code %d\n", rc); exit(-1); } -#define MAX_CHANNEL_COUNT 6 -#define FRAME_SIZE 240 - static snd_pcm_t *handle; static OpusMSDecoder* decoder; static short pcmBuffer[FRAME_SIZE * MAX_CHANNEL_COUNT]; static void alsa_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig) { int rc; - unsigned char alsaMapping[6]; + unsigned char alsaMapping[MAX_CHANNEL_COUNT]; /* The supplied mapping array has order: FL-FR-C-LFE-RL-RR * ALSA expects the order: FL-FR-RL-RR-C-LFE @@ -49,17 +46,12 @@ static void alsa_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGU alsaMapping[5] = opusConfig->mapping[3]; } - decoder = opus_multistream_decoder_create(opusConfig->sampleRate, - opusConfig->channelCount, - opusConfig->streams, - opusConfig->coupledStreams, - alsaMapping, - &rc); + decoder = opus_multistream_decoder_create(opusConfig->sampleRate, opusConfig->channelCount, opusConfig->streams, opusConfig->coupledStreams, alsaMapping, &rc); snd_pcm_hw_params_t *hw_params; snd_pcm_sw_params_t *sw_params; - snd_pcm_uframes_t period_size = FRAME_SIZE * opusConfig->channelCount * 2; - snd_pcm_uframes_t buffer_size = 12 * period_size; + snd_pcm_uframes_t period_size = FRAME_SIZE * FRAME_BUFFER; + snd_pcm_uframes_t buffer_size = 2 * period_size; unsigned int sampleRate = opusConfig->sampleRate; if (audio_device == NULL) @@ -75,16 +67,16 @@ static void alsa_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGU CHECK_RETURN(snd_pcm_hw_params_set_format(handle, hw_params, SND_PCM_FORMAT_S16_LE)); CHECK_RETURN(snd_pcm_hw_params_set_rate_near(handle, hw_params, &sampleRate, NULL)); CHECK_RETURN(snd_pcm_hw_params_set_channels(handle, hw_params, opusConfig->channelCount)); - CHECK_RETURN(snd_pcm_hw_params_set_buffer_size_near(handle, hw_params, &buffer_size)); CHECK_RETURN(snd_pcm_hw_params_set_period_size_near(handle, hw_params, &period_size, NULL)); + CHECK_RETURN(snd_pcm_hw_params_set_buffer_size_near(handle, hw_params, &buffer_size)); CHECK_RETURN(snd_pcm_hw_params(handle, hw_params)); snd_pcm_hw_params_free(hw_params); /* Set software parameters */ CHECK_RETURN(snd_pcm_sw_params_malloc(&sw_params)); CHECK_RETURN(snd_pcm_sw_params_current(handle, sw_params)); - CHECK_RETURN(snd_pcm_sw_params_set_start_threshold(handle, sw_params, buffer_size - period_size)); CHECK_RETURN(snd_pcm_sw_params_set_avail_min(handle, sw_params, period_size)); + CHECK_RETURN(snd_pcm_sw_params_set_start_threshold(handle, sw_params, 1)); CHECK_RETURN(snd_pcm_sw_params(handle, sw_params)); snd_pcm_sw_params_free(sw_params); diff --git a/src/audio/omx.c b/src/audio/omx.c index bf8f7d3..1c21427 100644 --- a/src/audio/omx.c +++ b/src/audio/omx.c @@ -1,7 +1,7 @@ /* * This file is part of Moonlight Embedded. * - * Copyright (C) 2015, 2016 Iwan Timmer + * Copyright (C) 2015-2017 Iwan Timmer * * Moonlight is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,9 +25,6 @@ #include "bcm_host.h" #include "ilclient.h" -#define MAX_CHANNEL_COUNT 6 -#define FRAME_SIZE 240 - static OpusMSDecoder* decoder; ILCLIENT_T* handle; COMPONENT_T* component; @@ -38,7 +35,7 @@ static int channelCount; static void omx_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig) { int rc, error; OMX_ERRORTYPE err; - unsigned char omxMapping[6]; + unsigned char omxMapping[MAX_CHANNEL_COUNT]; char* componentName = "audio_render"; channelCount = opusConfig->channelCount; @@ -52,17 +49,12 @@ static void omx_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGUR omxMapping[3] = opusConfig->mapping[2]; } - decoder = opus_multistream_decoder_create(opusConfig->sampleRate, - opusConfig->channelCount, - opusConfig->streams, - opusConfig->coupledStreams, - omxMapping, - &rc); + decoder = opus_multistream_decoder_create(opusConfig->sampleRate, opusConfig->channelCount, opusConfig->streams, opusConfig->coupledStreams, omxMapping, &rc); handle = ilclient_init(); if (handle == NULL) { - fprintf(stderr, "IL client init failed\n"); - exit(1); + fprintf(stderr, "IL client init failed\n"); + exit(1); } if (ilclient_create_component(handle, &component, componentName, ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS) != 0) { @@ -104,30 +96,30 @@ static void omx_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGUR switch(channelCount) { case 1: - sPCMMode.eChannelMapping[0] = OMX_AUDIO_ChannelCF; - break; + sPCMMode.eChannelMapping[0] = OMX_AUDIO_ChannelCF; + break; case 8: - sPCMMode.eChannelMapping[7] = OMX_AUDIO_ChannelRS; + sPCMMode.eChannelMapping[7] = OMX_AUDIO_ChannelRS; case 7: - sPCMMode.eChannelMapping[6] = OMX_AUDIO_ChannelLS; + sPCMMode.eChannelMapping[6] = OMX_AUDIO_ChannelLS; case 6: - sPCMMode.eChannelMapping[5] = OMX_AUDIO_ChannelRR; + sPCMMode.eChannelMapping[5] = OMX_AUDIO_ChannelRR; case 5: - sPCMMode.eChannelMapping[4] = OMX_AUDIO_ChannelLR; + sPCMMode.eChannelMapping[4] = OMX_AUDIO_ChannelLR; case 4: - sPCMMode.eChannelMapping[3] = OMX_AUDIO_ChannelLFE; + sPCMMode.eChannelMapping[3] = OMX_AUDIO_ChannelLFE; case 3: - sPCMMode.eChannelMapping[2] = OMX_AUDIO_ChannelCF; + sPCMMode.eChannelMapping[2] = OMX_AUDIO_ChannelCF; case 2: - sPCMMode.eChannelMapping[1] = OMX_AUDIO_ChannelRF; - sPCMMode.eChannelMapping[0] = OMX_AUDIO_ChannelLF; - break; + sPCMMode.eChannelMapping[1] = OMX_AUDIO_ChannelRF; + sPCMMode.eChannelMapping[0] = OMX_AUDIO_ChannelLF; + break; } err = OMX_SetParameter(ilclient_get_handle(component), OMX_IndexParamAudioPcm, &sPCMMode); if(err != OMX_ErrorNone){ - fprintf(stderr, "PCM mode unsupported\n"); - return; + fprintf(stderr, "PCM mode unsupported\n"); + return; } OMX_CONFIG_BRCMAUDIODESTINATIONTYPE arDest; diff --git a/src/audio/pulse.c b/src/audio/pulse.c index be47dc5..9322502 100644 --- a/src/audio/pulse.c +++ b/src/audio/pulse.c @@ -1,7 +1,7 @@ /* * This file is part of Moonlight Embedded. * - * Copyright (C) 2015 Iwan Timmer + * Copyright (C) 2015-2017 Iwan Timmer * * Moonlight is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,9 +26,6 @@ #include #include -#define MAX_CHANNEL_COUNT 6 -#define FRAME_SIZE 240 - static OpusMSDecoder* decoder; static pa_simple *dev = NULL; static short pcmBuffer[FRAME_SIZE * MAX_CHANNEL_COUNT]; @@ -52,7 +49,7 @@ bool audio_pulse_init() { static void pulse_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig) { int rc, error; - unsigned char alsaMapping[6]; + unsigned char alsaMapping[MAX_CHANNEL_COUNT]; channelCount = opusConfig->channelCount; diff --git a/src/audio/sdl.c b/src/audio/sdl.c index 8da514a..35c65ba 100644 --- a/src/audio/sdl.c +++ b/src/audio/sdl.c @@ -1,7 +1,7 @@ /* * This file is part of Moonlight Embedded. * - * Copyright (C) 2015 Iwan Timmer + * Copyright (C) 2015-2017 Iwan Timmer * * Moonlight is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,9 +25,6 @@ #include #include -#define MAX_CHANNEL_COUNT 6 -#define FRAME_SIZE 240 - static OpusMSDecoder* decoder; static short pcmBuffer[FRAME_SIZE * MAX_CHANNEL_COUNT]; static SDL_AudioDeviceID dev; @@ -35,12 +32,7 @@ static int channelCount; static void sdl_renderer_init(int audioConfiguration, POPUS_MULTISTREAM_CONFIGURATION opusConfig) { int rc; - decoder = opus_multistream_decoder_create(opusConfig->sampleRate, - opusConfig->channelCount, - opusConfig->streams, - opusConfig->coupledStreams, - opusConfig->mapping, - &rc); + decoder = opus_multistream_decoder_create(opusConfig->sampleRate, opusConfig->channelCount, opusConfig->streams, opusConfig->coupledStreams, opusConfig->mapping, &rc); channelCount = opusConfig->channelCount;