ossaudiodev — Доступ к устройствам аудио, совместимым с OSS
Этот модуль позволяет получить доступ к аудиоинтерфейсу OSS (Open Sound System). OSS доступен для широкого спектра открытых и коммерческих Unix-подобных систем и является стандартным аудиоинтерфейсом для Linux и последних версий FreeBSD.
Изменено в версии 3.3: Операции в этом модуле теперь поднимают OSError, где ранее поднималось IOError.
См. также
- Руководство программиста по Open Sound System
-
официальная документация по C API OSS
Модуль определяет большое количество констант, предоставляемых драйвером устройства OSS; см. <sys/soundcard.h> в Linux или FreeBSD для списка.
ossaudiodev определяет следующие переменные и функции:
-
exception ossaudiodev.OSSAudioError -
Это исключение поднимается при определённых ошибках. Аргументом является строка, описывающая причину ошибки.
(Если
ossaudiodevполучает ошибку от системного вызова, такого какopen(),write(), илиioctl(), оно поднимаетOSError. Ошибки, обнаруженные непосредственноossaudiodev, приводят кOSSAudioError.)(Для обратной совместимости класс исключения также доступен как
ossaudiodev.error.)
-
ossaudiodev.open(mode) -
ossaudiodev.open(device, mode) -
Открывает аудиоустройство и возвращает объект аудиоустройства OSS. Этот объект поддерживает многие методы, подобные файловым, такие как
read(),write(), иfileno()(хотя есть тонкие различия между обычной семантикой Unix read/write и семантикой аудиоустройств OSS). Он также поддерживает ряд аудиоспецифических методов; см. ниже полный список методов.device — имя файла аудиоустройства для использования. Если он не указан, этот модуль сначала ищет устройство в переменной окружения
AUDIODEV. Если не найдено, используется/dev/dsp.mode — один из
'r'для чтения (запись),'w'для записи (воспроизведение) и'rw'для обоих. Поскольку многие звуковые карты позволяют только одному процессу иметь открытыми устройства записи или воспроизведения, открывать устройство только для необходимой активности — хорошая идея. Кроме того, некоторые звуковые карты полудуплексные: они могут быть открыты для чтения или записи, но не для обоих одновременно.Обратите внимание на необычный синтаксис вызова: первый аргумент необязательный, а второй — обязательный. Это историческая особенность совместимости со старым модулем
linuxaudiodev, которыйossaudiodevзаменяет.
-
ossaudiodev.openmixer([device]) -
Открывает устройство микшера и возвращает объект устройства микшера OSS. device — имя файла устройства микшера для использования. Если он не указан, этот модуль сначала ищет устройство в переменной окружения
MIXERDEV. Если не найдено, используется/dev/mixer.
22.9.1. Объекты аудиоустройств
Прежде чем писать в или читать из аудиоустройства, необходимо вызвать три метода в правильном порядке:
-
setfmt()для установки формата вывода -
channels()для установки количества каналов -
speed()для установки частоты дискретизации
В качестве альтернативы можно использовать метод setparameters() для одновременной установки всех трёх аудиопараметров. Это удобнее, но в некоторых случаях может быть менее гибким.
Объекты аудиоустройств, возвращаемые open(), определяют следующие методы и (только для чтения) атрибуты:
-
oss_audio_device.close() -
Явно закрывает аудиоустройство. Когда вы закончили запись в или чтение из аудиоустройства, вы должны явно закрыть его. Закрытое устройство больше нельзя использовать.
-
oss_audio_device.fileno() -
Возвращает дескриптор файла, связанный с устройством.
-
oss_audio_device.read(size) -
Читает size байтов из аудиовхода и возвращает их как строку Python. В отличие от большинства драйверов устройств Unix, аудиоустройства OSS в режиме блокировки (по умолчанию) будут блокировать
read(), пока всё необходимое количество данных не будет доступно.
-
oss_audio_device.write(data) -
Записывает объект типа байты data в аудиоустройство и возвращает количество записанных байтов. Если аудиоустройство находится в режиме блокировки (по умолчанию), все данные всегда записываются (опять же, это отличается от обычной семантики устройств Unix). Если устройство в режиме без блокировки, некоторые данные могут не быть записаны — см.
writeall().Изменено в версии 3.5: Теперь принимается любой объект типа байты.
-
oss_audio_device.writeall(data) -
Записывает объект типа байты data в аудиоустройство: ожидает, пока аудиоустройство сможет принять данные, записывает столько данных, сколько сможет принять, и повторяет до тех пор, пока data не будет полностью записано. Если устройство в режиме блокировки (по умолчанию), это имеет тот же эффект, что и
write();writeall()полезно только в режиме без блокировки. Не имеет возвращаемого значения, так как количество записанных данных всегда равно количеству предоставленных данных.Изменено в версии 3.5: Теперь принимается любой объект типа байты.
Изменено в версии 3.2: Объекты аудиоустройств также поддерживают протокол управления контекстом, т.е. могут использоваться в операторе with.
Следующие методы соответствуют ровно одному ioctl() системному вызову. Соответствие очевидно: например, setfmt() соответствует системному вызову SNDCTL_DSP_SETFMT ioctl, а sync() — SNDCTL_DSP_SYNC (это может быть полезно при обращении к документации OSS). Если системный вызов ioctl() терпит неудачу, они все поднимают OSError.
-
oss_audio_device.nonblock() -
Переводит устройство в режим без блокировки. После перехода в режим без блокировки, нет способа вернуть его обратно в режим блокировки.
-
oss_audio_device.getfmts() -
Возвращает битовую маску поддерживаемых аудиоформатов звуковой карты. Некоторые поддерживаемые форматы OSS:
Формат
Описание
AFMT_MU_LAWлогарифмическое кодирование (используется в файлах Sun
.auи/dev/audio)AFMT_A_LAWлогарифмическое кодирование
AFMT_IMA_ADPCMсжатый формат 4:1, определённый Interactive Multimedia Association
AFMT_U8Беззнаковый 8-битный аудио
AFMT_S16_LEЗнаковый 16-битный аудио, порядок байтов little-endian (как используется процессорами Intel)
AFMT_S16_BEЗнаковый 16-битный аудио, порядок байтов big-endian (как используется в 68k, PowerPC, Sparc)
AFMT_S8Знаковый 8-битный аудио
AFMT_U16_LEБеззнаковый 16-битный аудио, little-endian
AFMT_U16_BEБеззнаковый 16-битный аудио, big-endian
См. документацию OSS для полного списка аудиоформатов и обратите внимание, что большинство устройств поддерживают только подмножество этих форматов. Некоторые старые устройства поддерживают только
AFMT_U8; наиболее распространённый формат в наши дни —AFMT_S16_LE.
-
oss_audio_device.setfmt(format) -
Попробуйте установить текущий аудиоформат на формат — см.
getfmts()для списка. Возвращает аудиоформат, к которому было установлено устройство, который может не совпадать с запрошенным форматом. Также может использоваться для возвращения текущего аудиоформата — сделайте это, передав «аудиоформат»AFMT_QUERY.
-
oss_audio_device.channels(nchannels) -
Установите количество выходных каналов на nchannels. Значение 1 указывает монофонический звук, 2 — стереофонический. Некоторые устройства могут иметь более 2 каналов, а некоторые высококачественные устройства могут не поддерживать моно. Возвращает количество каналов, к которым было установлено устройство.
-
oss_audio_device.speed(samplerate) -
Попробуйте установить частоту дискретизации аудио на samplerate выборок в секунду. Возвращает фактически установленную частоту. Большинство звуковых устройств не поддерживают произвольные частоты дискретизации. Распространённые частоты:
Частота
Описание
8000
стандартная частота для
/dev/audio11025
запись речи
22050
44100
аудио качество CD (при 16 битах/выборке и 2 каналах)
96000
аудио качество DVD (при 24 битах/выборке)
-
oss_audio_device.sync() -
Ожидать, пока звуковое устройство не воспроизведёт все байты в своём буфере. (Это происходит неявно при закрытии устройства.) Документация OSS рекомендует закрывать и повторно открывать устройство вместо использования
sync().
-
oss_audio_device.reset() -
Немедленно остановить воспроизведение или запись и вернуть устройство в состояние, в котором оно может принимать команды. Документация OSS рекомендует закрывать и повторно открывать устройство после вызова
reset().
-
oss_audio_device.post() -
Уведомить драйвер о том, что, вероятно, произойдёт пауза в выводе, что позволит устройству более разумно обработать паузу. Вы можете использовать это после воспроизведения звукового эффекта, перед ожиданием ввода пользователя или перед выполнением ввода-вывода на диск.
Следующие удобные методы объединяют несколько ioctls или один ioctl и некоторые простые вычисления.
-
oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False]) -
Установите ключевые параметры аудио дискретизации — формат выборки, количество каналов и частоту дискретизации — в одном вызове метода. format, nchannels и samplerate должны быть указаны в методах
setfmt(),channels()иspeed(). Если strict истинно,setparameters()проверяет, был ли каждый параметр фактически установлен в запрошенное значение, и повышаетOSSAudioError, если нет. Возвращает кортеж (format, nchannels, samplerate), указывающий значения параметров, которые фактически были установлены драйвером устройства (т. е. такие же, как значения возвратаsetfmt(),channels()иspeed()).Например,
(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
эквивалентно
fmt = dsp.setfmt(fmt) channels = dsp.channels(channels) rate = dsp.rate(rate)
-
oss_audio_device.bufsize() -
Возвращает размер буфера оборудования в выборках.
-
oss_audio_device.obufcount() -
Возвращает количество выборок, которые находятся в буфере оборудования и ещё не воспроизведены.
-
oss_audio_device.obuffree() -
Возвращает количество выборок, которые можно поместить в буфер оборудования для воспроизведения без блокировки.
Объекты звуковых устройств также поддерживают несколько атрибутов только для чтения:
-
oss_audio_device.closed -
Логическое значение, указывающее, было ли устройство закрыто.
-
oss_audio_device.name -
Строка, содержащая имя файла устройства.
-
oss_audio_device.mode -
Режим ввода-вывода для файла, либо
"r", либо"rw", либо"w".
22.9.2. Объекты устройств микшера
Объект микшера предоставляет два метода, похожих на файлы:
-
oss_mixer_device.close() -
Этот метод закрывает открытый файл устройства микшера. Любые дальнейшие попытки использовать микшер после закрытия файла приведут к повышению
OSError.
-
oss_mixer_device.fileno() -
Возвращает номер дескриптора файла открытого устройства микшера.
Изменено в версии 3.2: Объекты микшера также поддерживают протокол управления контекстом.
Остальные методы специфичны для аудиомикширования:
-
oss_mixer_device.controls() -
Этот метод возвращает битовую маску, определяющую доступные элементы управления микшером («управление» — это конкретный смешиваемый «канал», такой как
SOUND_MIXER_PCMилиSOUND_MIXER_SYNTH). Эта битовая маска указывает подмножество всех доступных элементов управления микшером — константыSOUND_MIXER_*, определённые на уровне модуля. Чтобы определить, например, поддерживает ли текущий объект микшера микшер PCM, используйте следующий код Python:mixer=ossaudiodev.openmixer() if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): # PCM is supported ... code ...Для большинства целей элементов управления
SOUND_MIXER_VOLUME(главный громкость) иSOUND_MIXER_PCMдолжно хватить, но код, использующий микшер, должен быть гибким, когда дело доходит до выбора элементов управления микшером. Например, на Gravis UltrasoundSOUND_MIXER_VOLUMEне существует.
-
oss_mixer_device.stereocontrols() -
Возвращает битовую маску, указывающую на элементы управления стерео микшером. Если бит установлен, соответствующее управление стерео; если он сброшен, управление либо монофоническое, либо не поддерживается микшером (используйте в сочетании с
controls()для определения, какое).См. пример кода для функции
controls()для примера получения данных из битовой маски.
-
oss_mixer_device.reccontrols() -
Возвращает битовую маску, определяющую элементы управления микшером, которые могут использоваться для записи. См. пример кода для
controls()для примера чтения из битовой маски.
-
oss_mixer_device.get(control) -
Возвращает громкость заданного элемента управления микшером. Возвращаемая громкость представляет собой 2-кортеж
(left_volume,right_volume). Громкость задаётся числами от 0 (тишина) до 100 (полная громкость). Если управление монофоническое, возвращается 2-кортеж, но обе громкости одинаковые.Вызывает
OSSAudioError, если указан недопустимый элемент управления, илиOSError, если указан неподдерживаемый элемент управления.
-
oss_mixer_device.set(control, (left, right)) -
Устанавливает громкость для заданного элемента управления микшером на
(left,right).leftиrightдолжны быть целыми числами и находиться в пределах от 0 (тишина) до 100 (полная громкость). При успешном выполнении новая громкость возвращается в виде 2-кортежа. Обратите внимание, что это может не быть точно таким же, как указанная громкость, из-за ограниченного разрешения микшеров некоторых звуковых карт.Вызывает
OSSAudioError, если указан недопустимый элемент управления микшером или указанные громкости находятся вне диапазона.
-
oss_mixer_device.get_recsrc() -
Этот метод возвращает битовую маску, указывающую, какой(ие) элемент(ы) управления в настоящее время используются в качестве источника записи.
-
oss_mixer_device.set_recsrc(bitmask) -
Вызовите эту функцию, чтобы указать источник записи. Возвращает битовую маску, указывающую новый источник записи (или источники), если операция выполнена успешно; вызывает
OSError, если указан недопустимый источник. Чтобы установить текущий источник записи на вход микрофона:mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/ossaudiodev.html