snd_pcm_plugin_read()

Передача PCM данных из канала захвата (плагино-зависимая функция)

Прототип:

#include <sys/asoundlib.h>
ssize_t snd_pcm_plugin_read( snd_pcm_t *handle,
void *buffer,
size_t size );

Аргументы:

handle
Дескриптор PCM устройства, созданный с помощью snd_pcm_open() или snd_pcm_open_preferred().
buffer
Указатель на буфер для заполнения.
size
Размер буфера в байтах.

Библиотека:

libasound

Описание:

Функция snd_pcm_plugin_read() считывает сэмплы из устройства, определяемого дескриптором handle. Формат сэмплов должен быть задан через snd_pcm_plugin_params().


Note: Аргументы handle и buffer должны быть корректными.

Функция может приостановить выполнение приложения, если блокирующие операции активны (см. snd_pcm_nonblock_mode()) и нет готовых к чтению данных.

Возвращаемое значение:

>=0
Число успешно считанных из устройства данных, если захват был успешным.
-EFAULT
Ошибка копирования данных.
-EINVAL
Частичная буферизация блоков данных отключена, но size не соответствует размеру полного блока данных.
-EIO
Канал не находится в состояниях prepared или running.
-ENOMEM
Недостаточно памяти для буферов плагина.


Note: Если считывается менее чем размер фрагмента, не будет возвращен статус -EFAULT или -EIO до тех пор, пока не будет считано ровно столько данных, каков размер фрагмента. Это связано с логикой работы плагина буферизации (см. snd_pcm_plugin_set_disable()). При накоплении полного фрагмента генерируется сообщение менеджеру io-audio (получить код ошибки до поступления сообщения в io-audio невозможно).

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Функция является плагино-зависимым аналогом snd_pcm_read(). Следует убедиться, что плагино-зависимый и независимый вызовы не смешиваются в приложении. В противном случае поведение будет непредсказуемым.

Плагино-зависмые версии вызово чтения и записи не требуют того, чтобы операции производитись с данными, кратными размеру фрагмента (в отличие от плагино-независимых вызовов). Это связано с логикой работы плагина буферизации (см. snd_pcm_plugin_set_disable()). Отключить его можно с помощью бита PLUGIN_DISABLE_BUFFER_PARTIAL_BLOCKS параметра функции snd_pcm_plugin_set_disable(). В этом случае плагино-зависимые функции буду возвращать ошибку при попытке работы с данными не кратными размеру фрагмента.

В любом случае чредующиеся стерео данные должны быть выровнены по размеру сэмплов (по числу каналов). Например, каждая запись должна иметь такое же число сэмплов для левого и правого каналов.

Тематические ссылки:

snd_pcm_plugin_set_disable(), snd_pcm_plugin_write(), snd_pcm_read()




Предыдущий раздел: Библиотека libasound