обновление(2020 -12 -25 ):Я создал сценарий оболочки для пересылки данных из стандартного ввода в стандартный вывод, который настраивает стандартный вывод, если это файл PCM. Проверьтеhttps://github.com/pasqualirb/pcmsh.
TL;DR :Параметры устройства должны быть установлены перед чтением или записью данных в него.
Шаг за шагом:
Откройте устройство PCM. Например.:fd = open("/dev/snd/pcmC0D0p", O_RDWR)
. После открытия PCM находится в состоянии OPEN
.
Установите параметры с помощью ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)
. Структура аппаратных параметров имеет маски(каждый бит представляет собой значение )и интервалы ([минимум, максимум] диапазон ). Параметры, которые не устанавливаются, должны быть переданы заполненными (всеми битами/значениями, установленными для масок; полный диапазон для интервалов ). После установки аппаратных параметров PCM находится в состоянии SETUP
. См. код pcm _set _config()TinyALSA.
Достаточно установок ACCESS
, FORMAT
, RATE
, CHANNELS
, PERIOD_SIZE
и PERIODS
. Другие параметры являются их вариантами, за исключением BUFFER_SIZE
, который в некоторых устройствах может быть установлен на значение, не кратное PERIOD_SIZE
.
Вызовите ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)
для подготовки переменных устройства и среды выполнения ALSA. После этого PCM находится в состоянии PREPARED
.
Начать чтение (захват )или запись (воспроизведение ).
Минимальное приложение для чтения или записи в устройство PCM будет иметь большую часть кода, связанного с манипулированием аппаратными параметрами.
Следуйте за командой rsync
с rm
, защищенной, чтобы убедиться, что она срабатывает только в случае успешного копирования
rsync -aAXHv --remove-source-files {src} {dst} &&
rm -rf {src}
Конечно, с этой комбинацией вам больше не обязательно нужен --remove-source-files
.