diff --git a/c_src/membrane_portaudio_plugin/pa_devices.c b/c_src/membrane_portaudio_plugin/pa_devices.c index 0fdb1a3..bac9dfb 100644 --- a/c_src/membrane_portaudio_plugin/pa_devices.c +++ b/c_src/membrane_portaudio_plugin/pa_devices.c @@ -1,31 +1,53 @@ #include "pa_devices.h" -UNIFEX_TERM list(UnifexEnv *env) { +UNIFEX_TERM list(UnifexEnv *env) +{ Pa_Initialize(); int numDevices = Pa_GetDeviceCount(); - if (numDevices < 0) { + device devices[numDevices]; + if (numDevices < 0) + { printf("\nERROR: Pa_CountDevices returned 0x%x\n", numDevices); - return list_result(env); - } else if (numDevices == 0) { - printf("\nNo audio devices found\n"); - } else { - printf("\nAvailable audio devices:\n\n"); + return list_result(env, devices, numDevices); + } + else if (numDevices == 0) + { + return list_result(env, devices, numDevices); + } + else + { int default_input_id = Pa_GetDefaultInputDevice(); int default_output_id = Pa_GetDefaultOutputDevice(); - for (int i = 0; i < numDevices; i++) { + for (int i = 0; i < numDevices; i++) + { const PaDeviceInfo *device_info = Pa_GetDeviceInfo(i); - const char *default_str = - i == default_input_id - ? " (default input)" - : i == default_output_id ? " (default output)" : ""; - printf("%s%s\r\n\tid: %d\r\n\tmax_input_channels: " - "%d\r\n\tmax_output_channels: %d\r\n\n", - device_info->name, default_str, i, device_info->maxInputChannels, - device_info->maxOutputChannels); + if (i == default_input_id) + { + devices[i].default_device = DEFAULT_DEVICE_INPUT; + } + else if (i == default_output_id) + { + devices[i].default_device = DEFAULT_DEVICE_OUTPUT; + } + else + { + devices[i].default_device = DEFAULT_DEVICE_FALSE; + } + + devices[i].name = malloc(strlen(device_info->name) + 1); + if (device_info->name != NULL) + { + strcpy(devices[i].name, device_info->name); + } + + devices[i].id = i; + devices[i].max_output_channels = device_info->maxOutputChannels; + devices[i].max_input_channels = device_info->maxInputChannels; + devices[i].default_sample_rate = device_info->defaultSampleRate; } } Pa_Terminate(); - return list_result(env); + return list_result(env, devices, numDevices); } diff --git a/c_src/membrane_portaudio_plugin/pa_devices.spec.exs b/c_src/membrane_portaudio_plugin/pa_devices.spec.exs index cf47fea..7f3a981 100644 --- a/c_src/membrane_portaudio_plugin/pa_devices.spec.exs +++ b/c_src/membrane_portaudio_plugin/pa_devices.spec.exs @@ -1,3 +1,15 @@ module Membrane.PortAudio.Devices -spec list() :: :ok +type( + device :: %Membrane.PortAudio.Device{ + id: int, + name: string, + max_input_channels: int, + max_output_channels: int, + default_sample_rate: float, + default_device: default_device + } +) + +type(default_device :: false | :input | :output) +spec list() :: devices :: [device] diff --git a/lib/membrane_portaudio.ex b/lib/membrane_portaudio.ex index 3f0b577..35e6e9e 100644 --- a/lib/membrane_portaudio.ex +++ b/lib/membrane_portaudio.ex @@ -20,6 +20,8 @@ defmodule Membrane.PortAudio do @spec print_devices() :: :ok def print_devices() do Application.ensure_all_started(:membrane_portaudio_plugin) + __MODULE__.SyncExecutor.apply(__MODULE__.Devices, :list, []) + |> IO.inspect() end end diff --git a/lib/membrane_portaudio_plugin/device.ex b/lib/membrane_portaudio_plugin/device.ex new file mode 100644 index 0000000..84bf08f --- /dev/null +++ b/lib/membrane_portaudio_plugin/device.ex @@ -0,0 +1,10 @@ +defmodule Membrane.PortAudio.Device do + defstruct [ + :id, + :name, + :max_input_channels, + :max_output_channels, + :is_default, + :default_sample_rate + ] +end