ossaudiodev — Доступ к аудиоустройствам, совместимым с OSS¶
Утратил актуальность с версии 3.11, будет удален в версии 3.13: Модуль ossaudiodev устарел (подробнее см. PEP 594).
Этот модуль позволяет вам получить доступ к аудиоинтерфейсу OSS (Open Sound System). OSS доступен для широкого спектра программ с открытым исходным кодом и коммерческих устройств и является стандартным аудиоинтерфейсом для Linux и последних версий FreeBSD.
См.также
- Open Sound System Programmer’s Guide
официальная документация для OSS C API
Модуль определяет большое количество констант, предоставляемых драйвером устройства OSS; список смотрите в <sys/soundcard.h> для Linux или FreeBSD.
ossaudiodev определяет следующие переменные и функции:
- exception ossaudiodev.OSSAudioError¶
Это исключение возникает при определенных ошибках. Аргументом является строка, описывающая, что пошло не так.
(Если
ossaudiodevполучает сообщение об ошибке из системного вызова, такого какopen(),write()илиioctl(), возникаетOSError. Ошибки, обнаруженные непосредственно с помощьюossaudiodev, приводят к появлениюOSSAudioError.)(Для обеспечения обратной совместимости класс exception также доступен как
ossaudiodev.error.)
- ossaudiodev.open(mode)¶
- ossaudiodev.open(device, mode)
Откройте аудиоустройство и верните объект OSS audio device. Этот объект поддерживает множество файловых методов, таких как
read(),write(), иfileno()(хотя существуют небольшие различия между обычной семантикой чтения/записи в Unix и семантикой аудиоустройств OSS). Он также поддерживает ряд специфичных для аудио методов; полный список методов приведен ниже.device - это имя используемого файла аудиоустройства. Если оно не указано, этот модуль сначала ищет устройство в переменной окружения
AUDIODEV. Если оно не найдено, возвращается к/dev/dsp.режим - это один из
'r'для доступа только для чтения (записи),'w'для доступа только для записи (воспроизведения) и'rw'для обоих режимов. Поскольку многие звуковые карты позволяют одновременно открывать диктофон или проигрыватель только в одном процессе, рекомендуется открывать устройство только для выполнения необходимых действий. Кроме того, некоторые звуковые карты являются полудуплексными: их можно открывать для чтения или записи, но не для обоих процессов одновременно.Обратите внимание на необычный синтаксис вызова: первый аргумент необязателен, а второй обязателен. Это исторический артефакт для совместимости со старым
linuxaudiodevмодулем, который заменяетossaudiodev.
- ossaudiodev.openmixer([device])¶
Откройте устройство mixer и верните объект OSS mixer device. device - это имя используемого файла устройства mixer. Если оно не указано, этот модуль сначала ищет устройство для использования в переменной окружения
MIXERDEV. Если он не найден, он возвращается к значению/dev/mixer.
Объекты аудиоустройства¶
Прежде чем вы сможете выполнять запись на аудиоустройство или чтение с него, вы должны вызвать три метода в правильном порядке:
setfmt()для установки выходного форматаchannels()для установки количества каналовspeed()для установки частоты дискретизации
В качестве альтернативы вы можете использовать метод setparameters() для одновременной настройки всех трех параметров звука. Это более удобно, но не во всех случаях может быть столь гибким.
Объекты аудиоустройства, возвращаемые с помощью open(), определяют следующие методы и атрибуты (доступные только для чтения):
- oss_audio_device.close()¶
Явно закройте аудиоустройство. Когда вы закончите запись на аудиоустройство или чтение с него, вам следует явно закрыть его. Закрытое устройство больше нельзя использовать.
- oss_audio_device.fileno()¶
Возвращает файловый дескриптор, связанный с устройством.
- oss_audio_device.read(size)¶
Считывает байты размера с аудиовхода и возвращает их в виде строки Python. В отличие от большинства драйверов устройств Unix, аудиоустройства OSS в режиме блокировки (по умолчанию) будут блокировать
read()до тех пор, пока не будет доступен весь запрошенный объем данных.
- oss_audio_device.write(data)¶
Запишите bytes-like object данные на аудиоустройство и верните количество записанных байт. Если аудиоустройство находится в режиме блокировки (по умолчанию), всегда записываются все данные (опять же, это отличается от обычной семантики устройств Unix). Если устройство находится в неблокирующем режиме, некоторые данные могут не записываться—см.
writeall().Изменено в версии 3.5: Теперь доступно для записи bytes-like object.
- oss_audio_device.writeall(data)¶
Записать bytes-like object данные на аудиоустройство: ожидает, пока аудиоустройство сможет принимать данные, записывает столько данных, сколько оно сможет принять, и повторяет до тех пор, пока данные не будут полностью записаны. Если устройство находится в режиме блокировки (по умолчанию), это приводит к тому же эффекту, что и
write();writeall()полезно только в неблокирующем режиме. Не имеет возвращаемого значения, так как объем записанных данных всегда равен объему предоставленных данных.Изменено в версии 3.5: Теперь доступно для записи bytes-like object.
Изменено в версии 3.2: Объекты аудиоустройств также поддерживают протокол управления контекстом, т.е. их можно использовать в инструкции with.
Каждый из следующих методов соответствует ровно одному : системный вызов c:func:ioctl. Соответствие очевидно: например, setfmt() соответствует SNDCTL_DSP_SETFMT ioctl, а sync() - SNDCTL_DSP_SYNC (это может быть полезно при ознакомлении с документацией OSS). Если базовый ioctl() терпит неудачу, все они вызывают OSError.
- oss_audio_device.nonblock()¶
Переведите устройство в неблокируемый режим. Если устройство находится в неблокируемом режиме, вернуть его в режим блокировки будет невозможно.
- oss_audio_device.getfmts()¶
Возвращает битовую маску выходных аудиоформатов, поддерживаемых звуковой картой. Некоторые из форматов, поддерживаемых операционной системой, включают:
Формат
Описание
AFMT_MU_LAWлогарифмическая кодировка (используется файлами Sun
.auи/dev/audio)AFMT_A_LAWлогарифмическая кодировка
AFMT_IMA_ADPCMсжатый формат 4:1, определенный Ассоциацией интерактивных мультимедиа
AFMT_U8Беззнаковое 8-битное аудио
AFMT_S16_LEПодписанный, 16-битный звук, порядок байтов в конце строки (используется процессорами Intel)
AFMT_S16_BEПодписанный, 16-битный звук, порядок байтов в конце строки (используется в 68k, PowerPC, Sparc)
AFMT_S8Подписанный, 8-битный звук
AFMT_U16_LEБеззнаковое 16-битное аудио с начальным кодом
AFMT_U16_BEБеззнаковое 16-битное аудио с большим порядком строк
Полный список аудиоформатов приведен в документации OSS, и обратите внимание, что большинство устройств поддерживают только часть этих форматов. Некоторые старые устройства поддерживают только
AFMT_U8; наиболее распространенным форматом, используемым сегодня, являетсяAFMT_S16_LE.
- oss_audio_device.setfmt(format)¶
Попробуйте установить для текущего аудиоформата значение 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()¶
Сообщите драйверу, что, скорее всего, в выводе будет пауза, что позволит устройству более разумно использовать паузу. Вы можете использовать это после воспроизведения звукового эффекта, перед ожиданием ввода данных пользователем или перед выполнением операций ввода-вывода с диска.
Следующие удобные методы сочетают в себе несколько ioctl или один ioctl и несколько простых вычислений.
- oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])¶
Установите ключевые параметры сэмплирования звука - формат сэмпла, количество каналов и частоту дискретизации - одним вызовом метода. format, nchannels и samplerate должны быть такими, как указано в методах
setfmt(),channels(), иspeed(). Если значение strict равно true,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".
Объекты микшерного устройства¶
Объект mixer предоставляет два файловых метода:
- oss_mixer_device.close()¶
Этот метод закрывает открытый файл устройства микширования. При любых дальнейших попытках использовать микшер после закрытия этого файла будет отображаться значение
OSError.
- oss_mixer_device.fileno()¶
Возвращает номер дескриптора файла открытого файла устройства микширования.
Изменено в версии 3.2: Объекты Mixer также поддерживают протокол управления контекстом.
Остальные методы специфичны для микширования звука:
- oss_mixer_device.controls()¶
Этот метод возвращает битовую маску, указывающую доступные элементы управления микшером («Control» - это конкретный микшируемый «канал», такой как
SOUND_MIXER_PCMилиSOUND_MIXER_SYNTH). Эта битовая маска указывает на подмножество всех доступных элементов управления микшером - константыSOUND_MIXER_*, определенные на уровне модуля. Чтобы определить, поддерживает ли, например, текущий объект 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, например,SOUND_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)