Skip to content

Commit

Permalink
Return devices (#58)
Browse files Browse the repository at this point in the history
* Return devices

* Fix typo

* add default

* PR comments

* whoops, missed id
  • Loading branch information
johns10 authored and mat-hek committed Jul 11, 2024
1 parent 579d65a commit da6745a
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 18 deletions.
56 changes: 39 additions & 17 deletions c_src/membrane_portaudio_plugin/pa_devices.c
Original file line number Diff line number Diff line change
@@ -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);
}
14 changes: 13 additions & 1 deletion c_src/membrane_portaudio_plugin/pa_devices.spec.exs
Original file line number Diff line number Diff line change
@@ -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]
2 changes: 2 additions & 0 deletions lib/membrane_portaudio.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
10 changes: 10 additions & 0 deletions lib/membrane_portaudio_plugin/device.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
defmodule Membrane.PortAudio.Device do
defstruct [
:id,
:name,
:max_input_channels,
:max_output_channels,
:is_default,
:default_sample_rate
]
end

0 comments on commit da6745a

Please sign in to comment.