processing / processing-sound

Audio library for Processing built with JSyn
https://processing.org/reference/libraries/sound/
GNU Lesser General Public License v2.1
149 stars 50 forks source link

make AudioDeviceManager and Engine public - enable Sound.getOutputDevices() #94

Open trackme518 opened 11 months ago

trackme518 commented 11 months ago

Engine.AudioDeviceManager audioManager = Sound.getAudioDeviceManager(); Get me an error: The type Engine is not visible

I would like to list and filter audio devices myself - specifically I want to list only output devices so I can create GUI for the user with list of devices to choose from.

I also want to be able to retrieve the individual device and for that I need to know the type - input or output. AudioDevice device = Engine.getEngine().outputDevice(i);

So ideally there would be method Sound.getOutputDevices() and Sound.getInputDevices() that would return the array of AudioDevice type. I can than loop through them, check their properties and decide what to do (like checking how many outputs it has, name, id, samplerate).

kevinstadler commented 11 months ago

Hello,

reading the number of output channels for a device is already possible through the MultiChannel.availableChannels(deviceId) method (all programmatic low-level information methods are in the MultiChannel class, in order not to overload the Sound class which has all options/settings that should suffice for basic users).

Just to clarify: there is no categorical distinction between input devices and output devices -- there is only one global list of audio devices, where any audio device has 0 or more input channels as well as 0 or more output channels. So it's possible that a device (notably most basic sound cards) are both an input and an output device at the same time. To test whether a given device from the global list is an "output device", one just needs to check whether the number of output channels is > 0, which can be done with the method above.

If you want to handle the AudioDeviceManager yourself, it doesn't actually make filtering for "output devices" any easier, but you can already do that -- it's not actually an internal class, it's the underlying JSyn object, so you'll just need to use the correct import (I will make sure to add that to the existing LowLevelEngine example, thanks!):

import com.jsyn.devices.AudioDeviceManager;

...

AudioDeviceManager audioManager = Sound.getAudioDeviceManager();