From 31ffb44ea07ded43d78694e276a620a9908c5744 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Wed, 6 Jan 2016 17:36:36 +0100 Subject: [PATCH] Print audio capturers in capabilities --- src/audio/audio_capture.h | 5 +++- src/audio/capture/alsa.c | 11 +++++++- src/audio/capture/coreaudio.c | 12 ++++++++ src/audio/capture/jack.c | 9 ++++++ src/audio/capture/none.c | 7 +++++ src/audio/capture/portaudio.c | 9 ++++++ src/audio/capture/sdi.cpp | 50 ++++++++++++++++++++++++++++++---- src/audio/capture/testcard.cpp | 9 ++++++ src/host.cpp | 15 ++++++++++ src/types.h | 5 ++++ 10 files changed, 125 insertions(+), 7 deletions(-) diff --git a/src/audio/audio_capture.h b/src/audio/audio_capture.h index 60e350b72..68aeaf927 100644 --- a/src/audio/audio_capture.h +++ b/src/audio/audio_capture.h @@ -44,13 +44,16 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "../types.h" + #ifdef __cplusplus extern "C" { #endif -#define AUDIO_CAPTURE_ABI_VERSION 1 +#define AUDIO_CAPTURE_ABI_VERSION 2 struct audio_capture_info { + void (*probe)(struct device_info **available_devices, int *count); void (*help)(const char *driver_name); void *(*init)(const char *cfg); struct audio_frame *(*read)(void *state); diff --git a/src/audio/capture/alsa.c b/src/audio/capture/alsa.c index 3c952abd9..d0f77ab15 100644 --- a/src/audio/capture/alsa.c +++ b/src/audio/capture/alsa.c @@ -3,7 +3,7 @@ * @author Martin Pulec */ /* - * Copyright (c) 2011-2015 CESNET, z. s. p. o. + * Copyright (c) 2011-2016 CESNET, z. s. p. o. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -82,6 +82,14 @@ struct state_alsa_capture { bool non_interleaved; }; +static void audio_cap_alsa_probe(struct device_info **available_devices, int *count) +{ + *available_devices = malloc(sizeof(struct device_info)); + strcpy((*available_devices)[0].id, "alsa"); + strcpy((*available_devices)[0].name, "Default Linux audio input"); + *count = 1; +} + static void audio_cap_alsa_help(const char *driver_name) { UNUSED(driver_name); @@ -389,6 +397,7 @@ static void audio_cap_alsa_done(void *state) } static const struct audio_capture_info acap_alsa_info = { + audio_cap_alsa_probe, audio_cap_alsa_help, audio_cap_alsa_init, audio_cap_alsa_read, diff --git a/src/audio/capture/coreaudio.c b/src/audio/capture/coreaudio.c index 22198b634..c38700f2c 100644 --- a/src/audio/capture/coreaudio.c +++ b/src/audio/capture/coreaudio.c @@ -185,6 +185,17 @@ static OSStatus InputProc(void *inRefCon, return err; } +static void audio_cap_ca_probe(struct device_info **available_devices, int *count) +{ + *available_devices = malloc(sizeof(struct device_info)); + strcpy((*available_devices)[0].id, "ca"); + strcpy((*available_devices)[0].name, "Default OS X audio input"); + *count = 1; +} + + +} + static void audio_cap_ca_help(const char *driver_name) { UNUSED(driver_name); @@ -494,6 +505,7 @@ static void audio_cap_ca_done(void *state) } static const struct audio_capture_info acap_coreaudio_info = { + audio_cap_ca_probe, audio_cap_ca_help, audio_cap_ca_init, audio_cap_ca_read, diff --git a/src/audio/capture/jack.c b/src/audio/capture/jack.c index 417941b6a..257162a4c 100644 --- a/src/audio/capture/jack.c +++ b/src/audio/capture/jack.c @@ -107,6 +107,14 @@ static int jack_process_callback(jack_nframes_t nframes, void *arg) return 0; } +static void audio_cap_jack_probe(struct device_info **available_devices, int *count) +{ + *available_devices = malloc(sizeof(struct device_info)); + strcpy((*available_devices)[0].id, "jack"); + strcpy((*available_devices)[0].name, "JACK audio input"); + *count = 1; +} + static void audio_cap_jack_help(const char *driver_name) { UNUSED(driver_name); @@ -277,6 +285,7 @@ static void audio_cap_jack_done(void *state) } static const struct audio_capture_info acap_jack_info = { + audio_cap_jack_probe, audio_cap_jack_help, audio_cap_jack_init, audio_cap_jack_read, diff --git a/src/audio/capture/none.c b/src/audio/capture/none.c index f3ccf3934..bd1bb85c1 100644 --- a/src/audio/capture/none.c +++ b/src/audio/capture/none.c @@ -64,6 +64,12 @@ struct state_audio_capture_none { uint32_t magic; }; +static void audio_cap_none_probe(struct device_info **available_devices, int *count) +{ + *available_devices = NULL; + *count = 0; +} + static void audio_cap_none_help(const char *driver_name) { UNUSED(driver_name); @@ -95,6 +101,7 @@ static void audio_cap_none_done(void *state) } static const struct audio_capture_info acap_none_info = { + audio_cap_none_probe, audio_cap_none_help, audio_cap_none_init, audio_cap_none_read, diff --git a/src/audio/capture/portaudio.c b/src/audio/capture/portaudio.c index 5b8e694b9..f8716d97e 100644 --- a/src/audio/capture/portaudio.c +++ b/src/audio/capture/portaudio.c @@ -133,6 +133,14 @@ static void print_device_info(PaDeviceIndex device) printf(" %s (output channels: %d; input channels: %d)", device_info->name, device_info->maxOutputChannels, device_info->maxInputChannels); } +static void audio_cap_portaudio_probe(struct device_info **available_devices, int *count) +{ + *available_devices = malloc(sizeof(struct device_info)); + strcpy((*available_devices)[0].id, "portaudio"); + strcpy((*available_devices)[0].name, "Portaudio audio input"); + *count = 1; +} + static void audio_cap_portaudio_help(const char *driver_name) { UNUSED(driver_name); @@ -364,6 +372,7 @@ static void audio_cap_portaudio_done(void *state) } static const struct audio_capture_info acap_portaudio_info = { + audio_cap_portaudio_probe, audio_cap_portaudio_help, audio_cap_portaudio_init, audio_cap_portaudio_read, diff --git a/src/audio/capture/sdi.cpp b/src/audio/capture/sdi.cpp index 25ea59029..9ad0349a9 100644 --- a/src/audio/capture/sdi.cpp +++ b/src/audio/capture/sdi.cpp @@ -74,6 +74,30 @@ struct state_sdi_capture { static void audio_cap_sdi_help(const char *driver_name); +static void audio_cap_sdi_probe_common(struct device_info **available_devices, int *count, + const char *id, const char *name) +{ + *available_devices = (struct device_info *) malloc(sizeof(struct device_info)); + strcpy((*available_devices)[0].id, id); + strcpy((*available_devices)[0].name, name); + *count = 1; +} + +static void audio_cap_sdi_probe_embedded(struct device_info **available_devices, int *count) +{ + audio_cap_sdi_probe_common(available_devices, count, "embedded", "Embedded SDI/HDMI audio"); +} + +static void audio_cap_sdi_probe_aesebu(struct device_info **available_devices, int *count) +{ + audio_cap_sdi_probe_common(available_devices, count, "AESEBU", "Digital AES/EBU audio"); +} + +static void audio_cap_sdi_probe_analog(struct device_info **available_devices, int *count) +{ + audio_cap_sdi_probe_common(available_devices, count, "analog", "Analog audio through capture card"); +} + static void * audio_cap_sdi_init(const char *cfg) { if(cfg && strcmp(cfg, "help") == 0) { @@ -172,16 +196,32 @@ void sdi_capture_new_incoming_frame(void *state, struct audio_frame *frame) s->audio_frame_ready_cv.notify_one(); } - -static const struct audio_capture_info acap_sdi_info = { +static const struct audio_capture_info acap_sdi_info_embedded = { + audio_cap_sdi_probe_embedded, audio_cap_sdi_help, audio_cap_sdi_init, audio_cap_sdi_read, audio_cap_sdi_done }; -REGISTER_MODULE(embedded, &acap_sdi_info, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); -REGISTER_MODULE(AESEBU, &acap_sdi_info, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); -REGISTER_MODULE(analog, &acap_sdi_info, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); +static const struct audio_capture_info acap_sdi_info_aesebu = { + audio_cap_sdi_probe_aesebu, + audio_cap_sdi_help, + audio_cap_sdi_init, + audio_cap_sdi_read, + audio_cap_sdi_done +}; + +static const struct audio_capture_info acap_sdi_info_analog = { + audio_cap_sdi_probe_analog, + audio_cap_sdi_help, + audio_cap_sdi_init, + audio_cap_sdi_read, + audio_cap_sdi_done +}; + +REGISTER_MODULE(embedded, &acap_sdi_info_embedded, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); +REGISTER_MODULE(AESEBU, &acap_sdi_info_aesebu, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); +REGISTER_MODULE(analog, &acap_sdi_info_analog, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); /* vim: set expandtab: sw=8 */ diff --git a/src/audio/capture/testcard.cpp b/src/audio/capture/testcard.cpp index 12fdbaba3..7b5b4e657 100644 --- a/src/audio/capture/testcard.cpp +++ b/src/audio/capture/testcard.cpp @@ -87,6 +87,14 @@ struct state_audio_capture_testcard { unsigned int total_samples; }; +static void audio_cap_testcard_probe(struct device_info **available_devices, int *count) +{ + *available_devices = (struct device_info *) malloc(sizeof(struct device_info)); + strcpy((*available_devices)[0].id, "testcard"); + strcpy((*available_devices)[0].name, "Testing EBU signal"); + *count = 1; +} + static void audio_cap_testcard_help(const char *driver_name) { UNUSED(driver_name); @@ -281,6 +289,7 @@ static void audio_cap_testcard_done(void *state) } static const struct audio_capture_info acap_testcard_info = { + audio_cap_testcard_probe, audio_cap_testcard_help, audio_cap_testcard_init, audio_cap_testcard_read, diff --git a/src/host.cpp b/src/host.cpp index b04c88e57..4477fef18 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -9,6 +9,7 @@ #include "host.h" +#include "audio/audio_capture.h" #include "lib_common.h" #include "messaging.h" #include "video_capture.h" @@ -104,5 +105,19 @@ void print_capabilities(struct module *root, bool use_vidcap) } free(devices); } + + cout << "[cap] Audio capturers:" << endl; + auto const & audio_capabilities = + get_libraries_for_class(LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION); + for (auto const & it : audio_capabilities) { + auto aci = static_cast(it.second); + int count; + struct device_info *devices; + aci->probe(&devices, &count); + for (int i = 0; i < count; ++i) { + cout << "[cap] (" << devices[i].id << ";" << devices[i].name << ")\n"; + } + free(devices); + } } diff --git a/src/types.h b/src/types.h index fed50f855..31edefbc5 100644 --- a/src/types.h +++ b/src/types.h @@ -239,6 +239,11 @@ enum tx_media_type { TX_MEDIA_VIDEO }; +struct device_info { + char id[1024]; + char name[1024]; +}; + struct vidcap_params; #ifdef __cplusplus