Transfer PCM data from the capture channel (plugin-aware)
#include <sys/asoundlib.h> ssize_t snd_pcm_plugin_read( snd_pcm_t *handle, void *buffer, size_t size );
- The handle for the PCM device, which you must have opened by calling snd_pcm_open() or snd_pcm_open_preferred().
- A pointer to a buffer in which snd_pcm_plugin_read() can store the data that it reads.
- The size of the buffer, in bytes.
The snd_pcm_plugin_read() function reads samples from the device which must be in the proper format specified by snd_pcm_plugin_prepare().
|The handle and the buffer must be valid.|
This function may suspend the client application if block behavior is active (see snd_pcm_nonblock_mode()) and no data is available for reading.
A positive value that represents the number of bytes that were successfully read from the device if the capture was successful, or a negative value if an error occurred.
- Failed to copy data.
- Partial block buffering is disabled, but the size isn't the full block size.
- Unable to allocate memory for plugin buffers.
This function is the plugin-aware version of snd_pcm_read(). It functions exactly the same way, with only one caveat (see below). However, make sure that you don't mix and match plugin- and nonplugin-aware functions in your application, or you may get undefined behavior and misleading results.
The plugin-aware versions of the PCM read and write calls don't require that you work with multiples of fragment-size blocks (the nonplugin-aware versions do). This is because one of the plugins in the lib sub-buffers the data for you. You can disable this plugin by setting the PLUGIN_DISABLE_BUFFER_PARTIAL_BLOCKS bit with snd_pcm_plugin_set_disable(), in which case, the plugin-aware versions also fail on reads and writes that aren't multiples of the fragment size.
Either way, interleaved stereo data has to be aligned by the sample size times the number of channels (i.e. each write must have the same number of samples for the left and right channels).