snd_pcm_open_preferred()

Create a handle and open a connection to the preferred audio interface

Synopsis:

#include <sys/asoundlib.h>

int snd_pcm_open_preferred( snd_pcm_t **handle, 
                            int *rcard, 
                            int *rdevice, 
                            int mode );

Arguments:

handle
A pointer to a location where snd_pcm_open_preferred() can store a handle for the audio interface. You'll need this handle when you call the other snd_pcm_* functions.
rcard
If non-NULL, this must be a pointer to a location where snd_pcm_open_preferred() can store the number of the card that it opened.
rdevice
If non-NULL, this must be a pointer to a location where snd_pcm_open_preferred() can store the number of the audio device that it opened.
mode
One of:
  • SND_PCM_OPEN_PLAYBACK — open the playback channel (direction).
  • SND_PCM_OPEN_CAPTURE — open the capture channel (direction).

You can OR this flag with any of the above:

  • SND_PCM_OPEN_NONBLOCK — force the mode to be nonblocking. This affects any reading from or writing to the device that you do later; you can query the device any time without blocking.

    You can change the blocking setup later by calling snd_pcm_nonblock_mode() .

Library:

libasound.so

Use the -l asound option to qcc to link against this library.

Description:

The snd_pcm_open_preferred() function is an extension to the snd_pcm_open() function that attempts to open the user-selected default (or preferred) device for the system.

If you use this function, your application will be more flexible than if you use snd_pcm_open().

In a system where more than one PCM device exists, the user may set a preference for one of these devices. This function attempts to open that device and return a PCM handle to it. The function returns the card and device numbers if the rcard and rdevice arguments aren't NULL.

Here's the search order to find the preferred device:

  1. Read /etc/system/config/audio/preferences.
  2. If this file doesn't exist or has no entry, check PCM device 0 of card 0 for a software mixing overlay device. If this overlay device is found, it's opened.
  3. Open the default device 0 of card 0.

If all of the above fail, you don't have an audio system running.

Returns:

Zero on success, or a negative value on error.

Errors:

-EINVAL
Invalid mode.
-EACCES
Search permission is denied on a component of the path prefix, or the device exists and the permissions specified are denied.
-EINTR
The open() operation was interrupted by a signal.
-EMFILE
Too many file descriptors are currently in use by this process.
-ENFILE
Too many files are currently open in the system.
-ENOENT
The named device doesn't exist.
-SND_ERROR_INCOMPATIBLE_VERSION
The audio driver version is incompatible with the client library that the application uses.
-ENOMEM
No memory available for data structures.

Examples:

See the example in Opening your PCM device in the Playing and Capturing Audio Data chapter.

Classification:

QNX Neutrino

Safety:
Cancellation point No
Interrupt handler No
Signal handler Yes
Thread Yes

Caveats:

Successfully opening a PCM channel doesn't guarantee that there are enough audio resources free to handle your application. Audio resources (e.g. subchannels) are allocated when you configure the channel by calling snd_pcm_channel_params() or snd_pcm_plugin_params() .