Portaudio: refactor a bit

This commit is contained in:
Martin Pulec
2018-11-28 16:40:43 +01:00
parent d8a24851a1
commit 2dee5510b7
4 changed files with 70 additions and 136 deletions

View File

@@ -82,20 +82,12 @@ struct state_portaudio_capture {
struct ring_buffer *buffer;
};
enum audio_device_kind {
AUDIO_IN,
AUDIO_OUT
};
/*
* For Portaudio threads-related issues see
* http://www.portaudio.com/trac/wiki/tips/Threading
*/
static void print_device_info(PaDeviceIndex device);
static int portaudio_start_stream(PaStream *stream);
static void portaudio_close(PaStream *stream); // closes and frees all audio resources ( according to valgrind this is not true.. )
static void portaudio_print_available_devices(enum audio_device_kind);
static int callback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
@@ -118,19 +110,6 @@ static int portaudio_start_stream(PaStream *stream)
return 0;
}
static void print_device_info(PaDeviceIndex device)
{
if( (device < 0) || (device >= Pa_GetDeviceCount()) )
{
printf("Requested info on non-existing device");
return;
}
const PaDeviceInfo *device_info = Pa_GetDeviceInfo(device);
printf(" %s (output channels: %d; input channels: %d; %s)", device_info->name, device_info->maxOutputChannels, device_info->maxInputChannels, portaudio_get_api_name(device));
}
static void audio_cap_portaudio_probe(struct device_info **available_devices, int *count)
{
*available_devices = malloc(sizeof(struct device_info));
@@ -142,50 +121,7 @@ static void audio_cap_portaudio_probe(struct device_info **available_devices, in
static void audio_cap_portaudio_help(const char *driver_name)
{
UNUSED(driver_name);
portaudio_print_available_devices(AUDIO_IN);
}
static void portaudio_print_available_devices(enum audio_device_kind kind)
{
int numDevices;
int i;
PaError error;
error = Pa_Initialize();
if(error != paNoError)
{
printf("error initializing portaudio\n");
printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) );
return;
}
numDevices = Pa_GetDeviceCount();
if( numDevices < 0)
{
printf("Error getting portaudio devices number\n");
return;
}
if( numDevices == 0)
{
printf("There are NO available audio devices!\n");
return;
}
printf("\tportaudio : use default Portaudio device (marked with star)\n");
for(i = 0; i < numDevices; i++)
{
if((i == Pa_GetDefaultInputDevice() && kind == AUDIO_IN) ||
(i == Pa_GetDefaultOutputDevice() && kind == AUDIO_OUT))
printf("(*) ");
printf("\tportaudio:%d :", i);
print_device_info(i);
printf("\n");
}
return;
portaudio_print_available_devices(PORTAUDIO_IN);
}
static void portaudio_close(PaStream * stream) // closes and frees all audio resources
@@ -257,13 +193,13 @@ static void * audio_cap_portaudio_init(const char *cfg)
if(input_device == -1)
{
printf("Using default input audio device");
print_device_info(Pa_GetDefaultInputDevice());
portaudio_print_device_info(Pa_GetDefaultInputDevice());
printf("\n");
inputParameters.device = Pa_GetDefaultInputDevice();
device_info = Pa_GetDeviceInfo(Pa_GetDefaultInputDevice());
} else if(input_device >= 0) {
printf("Using input audio device:");
print_device_info(input_device);
portaudio_print_device_info(input_device);
printf("\n");
inputParameters.device = input_device;
device_info = Pa_GetDeviceInfo(input_device);

View File

@@ -89,20 +89,13 @@ struct state_portaudio_playback {
bool quiet;
};
enum audio_device_kind {
AUDIO_IN,
AUDIO_OUT
};
/*
* For Portaudio threads-related issues see
* http://www.portaudio.com/trac/wiki/tips/Threading
*/
/* prototyping */
static void print_device_info(PaDeviceIndex device);
static void portaudio_close(PaStream *stream); /* closes and frees all audio resources ( according to valgrind this is not true.. ) */
static void portaudio_print_available_devices(enum audio_device_kind);
static int callback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
@@ -129,18 +122,6 @@ static bool portaudio_start_stream(PaStream *stream)
return true;
}
static void print_device_info(PaDeviceIndex device)
{
if( (device < 0) || (device >= Pa_GetDeviceCount()) )
{
printf("Requested info on non-existing device");
return;
}
const PaDeviceInfo *device_info = Pa_GetDeviceInfo(device);
printf(" %s (output channels: %d; input channels: %d; %s)", device_info->name, device_info->maxOutputChannels, device_info->maxInputChannels, portaudio_get_api_name(device));
}
static void audio_play_portaudio_probe(struct device_info **available_devices, int *count)
{
*available_devices = (struct device_info *) malloc(sizeof(struct device_info));
@@ -152,52 +133,7 @@ static void audio_play_portaudio_probe(struct device_info **available_devices, i
static void audio_play_portaudio_help(const char *driver_name)
{
UNUSED(driver_name);
portaudio_print_available_devices(AUDIO_OUT);
}
static void portaudio_print_available_devices(enum audio_device_kind kind)
{
int numDevices;
int i;
PaError error;
error = Pa_Initialize();
if(error != paNoError)
{
printf("error initializing portaudio\n");
printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) );
return;
}
numDevices = Pa_GetDeviceCount();
if( numDevices < 0)
{
printf("Error getting portaudio devices number\n");
Pa_Terminate();
return;
}
if( numDevices == 0)
{
printf("There are NO available audio devices!\n");
Pa_Terminate();
return;
}
printf("\tportaudio : use default Portaudio device (marked with star)\n");
for(i = 0; i < numDevices; i++)
{
if((i == Pa_GetDefaultInputDevice() && kind == AUDIO_IN) ||
(i == Pa_GetDefaultOutputDevice() && kind == AUDIO_OUT))
printf("(*) ");
printf("\tportaudio:%d :", i);
print_device_info(i);
printf("\n");
}
Pa_Terminate();
portaudio_print_available_devices(PORTAUDIO_OUT);
}
static void portaudio_close(PaStream * stream) // closes and frees all audio resources
@@ -395,14 +331,14 @@ static int audio_play_portaudio_reconfigure(void *state, struct audio_desc desc)
{
printf("\nUsing default output audio device:");
fflush(stdout);
print_device_info(Pa_GetDefaultOutputDevice());
portaudio_print_device_info(Pa_GetDefaultOutputDevice());
printf("\n");
outputParameters.device = Pa_GetDefaultOutputDevice();
}
else if(s->device >= 0)
{
printf("\nUsing output audio device:");
print_device_info(s->device);
portaudio_print_device_info(s->device);
printf("\n");
outputParameters.device = s->device;
}

View File

@@ -45,7 +45,7 @@
#include "portaudio_common.h"
const char *portaudio_get_api_name(PaDeviceIndex device) {
static const char *portaudio_get_api_name(PaDeviceIndex device) {
for (int i = 0; i < Pa_GetHostApiCount(); ++i) {
const PaHostApiInfo *info = Pa_GetHostApiInfo(i);
for (int j = 0; j < info->deviceCount; ++j) {
@@ -58,3 +58,59 @@ const char *portaudio_get_api_name(PaDeviceIndex device) {
return "(unknown API)";
}
void portaudio_print_device_info(PaDeviceIndex device)
{
if( (device < 0) || (device >= Pa_GetDeviceCount()) )
{
printf("Requested info on non-existing device");
return;
}
const PaDeviceInfo *device_info = Pa_GetDeviceInfo(device);
printf(" %s (output channels: %d; input channels: %d; %s)", device_info->name, device_info->maxOutputChannels, device_info->maxInputChannels, portaudio_get_api_name(device));
}
void portaudio_print_available_devices(enum portaudio_device_direction kind)
{
int numDevices;
int i;
PaError error;
error = Pa_Initialize();
if(error != paNoError)
{
printf("error initializing portaudio\n");
printf("\tPortAudio error: %s\n", Pa_GetErrorText( error ) );
return;
}
numDevices = Pa_GetDeviceCount();
if( numDevices < 0)
{
printf("Error getting portaudio devices number\n");
goto error;
}
if( numDevices == 0)
{
printf("There are NO available audio devices!\n");
goto error;
}
printf("\tportaudio : use default Portaudio device (marked with star)\n");
for(i = 0; i < numDevices; i++)
{
if((i == Pa_GetDefaultInputDevice() && kind == PORTAUDIO_IN) ||
(i == Pa_GetDefaultOutputDevice() && kind == PORTAUDIO_OUT))
printf("(*) ");
printf("\tportaudio:%d :", i);
portaudio_print_device_info(i);
printf("\n");
}
error:
Pa_Terminate();
}

View File

@@ -42,7 +42,13 @@
extern "C" {
#endif
const char *portaudio_get_api_name(PaDeviceIndex device);
enum portaudio_device_direction {
PORTAUDIO_IN,
PORTAUDIO_OUT
};
void portaudio_print_available_devices(enum portaudio_device_direction);
void portaudio_print_device_info(PaDeviceIndex device);
#ifdef __cplusplus
}