Which /dev/... (devices) are the microphone and speaker in Mac OS X? - macos

I have a MacBook Alluminium and I want to capture the microphone in a RAW format and output a RAW audio through the speakers, in a standard way, i.e., using the terminal with standard Unix commands and using the standard /dev/??? devices.
So, the question/s:
Which devices are the microphone and speakers? Those both should start with /dev/...
Are they different if they are built-in or external? Which ones?
(Also they have to start with /dev/...)
If you know also the unix commands to print the microphone input and to write the output for speakers that would be extra points! :) (I want to capture it from mic, modify it -I got it-, and send it modified to speakers)
If you know also the Assembly instructions for OSX that would be the perfection! But the main questions are which are in the bulleted list.
Thanks!

None of them. Not all devices have /dev nodes on Mac OS X, and audio devices are not among them. There is no way I'm aware of to access audio devices using only "standard" terminal commands. sox can be used if you install it, but it is not shipped with Mac OS X.
The primary supported API to access audio devices on Mac OS X is Core Audio. Third-party libraries, such as libao, are also available which can expose a simpler, platform-independent interface to Core Audio.

As #duskwuff says, you probably won't have any joy trying to access sound devices using /dev devices on OS X.
If, as you say in your comment above, your goal is cross-platform portability then perhaps PortAudio might be a solution.
From their homepage:
PortAudio is a free, cross-platform, open-source, audio I/O library.
It lets you write simple audio programs in 'C' or C++ that will
compile and run on many platforms including Windows, Macintosh OS X,
and Unix (OSS/ALSA). It is intended to promote the exchange of audio
software between developers on different platforms. Many applications
use PortAudio for Audio I/O.
On OS X I believe they use Core Audio and on Linux they use OSS/ALSA.

Related

Hog mode / Exclusive access to audio output device with SoX

I would like to know whether SoX/LibSoX offers the possibility to access a sound device in exclusive/hog mode. The idea is to prevent other applications from accessing the sound card / DAC that is being used by the focal app.
My main target is OSX CoreAudio output, but I am also eager to know about Linux (OSS/Alsa).
I know this is possible in CoreAudio, because I have seen it implemented in several apps, including this open source one.
On Mac OS X at least, the answer appears to be no. In http://sourceforge.net/p/sox/code/ci/master/tree/src/coreaudio.c SoX uses the default input or output device but there is no provision for hog mode.

windows programming: grab audio without the driver supporting "Stereo Mix

Grabbing the system audio using 'Stereo Mix' is easy, but most modern drivers don't support that anymore. Steam local streaming somehow managed to do it without, i can clearly hear other apps audio output while streaming an arbitrary game.
How does steam do that? Did they silently install a driver? Is there any other way of grabbing system audio?
From Windows 7 and up that is.
From Vista and later you can use WASAPI. It allows to use loopback for any output device, just use an output as an input with the AUDCLNT_STREAMFLAGS_LOOPBACK flag for this function: http://msdn.microsoft.com/en-us/library/windows/desktop/dd370875(v=vs.85).aspx

OSX -- Output WAV independently to 12 speakers connected via USB soundcards

I wish to simultaneously play sounds through up to 12 mono speakers.
I could connect these to my MacBook using 6 USB soundcards, and use the left and right channel of each.
But how can I get the MacBook to play sound out of speaker #5, for example?
PS If anyone can see a smarter way to wire up 12 speakers to a MacBook, please do say!
You can setup an Aggregate Device (Audio Midi Setup > Create Aggregate Device), which allows the ability to combine multiple devices of the same model, or to combine multiple inputs and outputs for apps that don't support separate input and output devices. This Apple guide shows how it works and is surprisingly quite easy to setup.
Another way to route audio to multiple channels and outputs (up to 64) is with the free app/plug-in Soundflower. You can download a compiled version, or compile the source code if you want/need to specifically do something that the current compiled version might not.

Mac OS X virtual audio driver

I want to create a virtual audio device that gets audio data from the default output (which is an output IOAudioStream) and converts it to an input IOAudioStream.
I went through most of the examples I could find, however they only implement a feature to copy the output IOAudioStream to the input one at most. That means it only converts the audio to an input stream if the audio device is selected as output.
This should be possible, since ScreenFlow allows recording of computer audio by installing a kext that creates a virtual driver.
How can I access the audio data from the default output and send it to my virtual driver?
Take a look at the open-source WavTap, which is a simplified fork of the open-source SoundFlower virtual sound card driver. It is a .kext that I believe does substantially what you want.
For reference, here is how some popular commercial closed-source options work:
Rogue Amoeba's Audio Hijack Pro
-Captures system audio via code based off of the open-source SoundFlower .kext
-Captures an application's audio by substituting a "patch" framework for the normal CoreAudio.framework when launching the application
-Captures an already-running application's audio with the help of the haxie "Application Enhancer" (APE) from Unsanity
These features are branded as their "Instant On" feature (InstantOn.kext).
Ambrosia Software's WireTap Studio
-Captures system audio and application audio via an in-house developed .kext
Telestream's ScreenFlow
-Captures system audio via an in-house developed .kext. (Version 2.x uses varaudio.kext; Version 3.x uses TelestreamAudio.kext)
Macsome's Audio Recorder
-Unknown method
Araelium Group's Screenflick
-Captures system audio using the SoundFlower .kext
UPDATE #1
After reading the author's comments, it appears the underlying goal is to be able to capture the system sound without publishing the virtual audio driver as a device (that would appear in the System Preference's list) and without changing the current default output device (or at least the appearance that the device has changed).
SoundFlower: Adds a sound device to the list upon installation
WavTap: Adds a sound device to the list upon installation; auto-selects the device when the WavTap application is started; auto-deselects the device when the application is shutdown and reselects the previous device
Audio Hijack Pro: Adds a sound device only when audio capture of the default system sound is selected; removes the sound device when audio capture is no longer selected and reselects the previous device
WireTap Studio: Unknown
ScreenFlow: Captures the system sound without changing the current default output device and without publishing the virtual audio driver as a device
UPDATE #2
A quote from Jeff Moore, a CoreAudio Apple engineer, in reference to applications such as WireTap and Audio Hijack Pro:
"There are no APIs on the system that will give you the output of any specific app or the whole mix going to the hardware...[Capturing System Sound] isn't supported by the System and those folks had to be clever. There's nothing stopping you from doing the same thing except how willing you are to get your hands dirty.
The fact is, Mac OS X's audio system was designed first and foremost for performance. This lead us to a design where it is not easy to support the functionality you want without imposing performance penalties. So, we have opted for better performance at the cost of not being able to provide this feature."
If you want to read more on the subject, check out these threads on the CoreAudio API mailing list:
"WireTap, CoreAudio's API, and system capture, and kexts..."
"Another question on capturing audio played back by a software"
"Capturing currently played audio using CoreAudio on Mac"
"'audio hijack'"
"monitoring system audio output like wire tap"
"Capturing audio output to a file"
"Mirroring Audio Output"
"Recording system audio"
Relevant SO Questions:
Hide Audio device using codeless kext
So long story short, you're not likely to find examples from Apple that accomplish this, and you're not likely to find open source code that accomplishes this either, unless someone is feeling very generous. It appears to be too valuable of information.
After additional research, here are some theoretical techniques I came up with that might allow you to accomplish your goal:
Similar to Prosoft Engineering's Hear product, you could create a HAL plugin (user-mode virtual driver) rather than a .kext (kernel-mode virtual driver). Apple has a sample HAL plugin called "SampleHardwarePlugIn" and PulseAudio has one as well. However, with his method I don't think you get access to a pre-mixed system sound stream. You would have to gather up all streams from the various applications (which must use CoreAudio to play sound) and mix them together for pseudo system sound capture.
Create a virtual audio device that is hidden [1][2] from user interaction. When the user wishes to capture the default sound, programmatically create an aggregate device that includes your hidden virtual device and the current default sound device. Temporarily set this aggregate device as the default output. In this manner, you are able to both capture the default sound and hear it.
Side Note: If Mac OS X allows for a hidden device to also be set as the default output device, what would System Preferences show as the selected device? If it instead shows the secondary output device as selected, then you have the added allusion that nothing has changed.
A newer open-source virtual audio device that works with the latest versions of MacOS is BlackHole - it supports multiple audio channels and sampling rates.
It can be used as an audio sink and/or source. It's also handy as part of an aggregate audio device so audio can be heard and re-routed - e.g. using the MacOS Audio MIDI Setup app

How to use a USB speaker and built-in audio speakers simultaneously on Mac OS X 10.6 using Cocoa or anything else?

How to use a USB speaker and built-in audio speakers simultaneously on Mac OS X 10.6 using Cocoa or anything else?
I want to use the built-in speakers and USB speakers simultaneously on Mac OS X 10.6.
I want to play different files on these (I do not want to play same file on both speakers).
Is is possible using Cocoa or anything else?
Programmatically it's possible using a library like portaudio - you open two different streams (using Pa_OpenStream) and you get two different callbacks that you use to inject audio data.
I'm sure it's possible using Core Audio too, but that's more complicated.
Rogue Amoeba's Airfoil can redirect the audio stream from a single application to, f/ex, an Airport Express, leaving other audio to go the system speakers. I don't have a USB audio device to test your specific application, but you can try it free.

Resources