ossaudiodev
— Доступ к OSS-совместимым аудиоустройствам¶
Не рекомендуется, начиная с версии 3.11: Модуль ossaudiodev
является устаревшим (подробнее см. PEP 594).
Этот модуль позволяет вам получить доступ к аудиоинтерфейсу OSS (Open Sound System). OSS доступен для широкого спектра открытых и коммерческих Unices, и является стандартным аудиоинтерфейсом для Linux и последних версий FreeBSD.
Изменено в версии 3.3: Операции в этом модуле теперь поднимают OSError
там, где раньше поднимали IOError
.
См.также
- 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
).(Для обратной совместимости класс исключений также доступен в виде
ossaudiodev.error
).
-
ossaudiodev.
open
(mode)¶ -
ossaudiodev.
open
(device, mode) Открыть аудиоустройство и вернуть объект аудиоустройства OSS. Этот объект поддерживает множество файлоподобных методов, таких как
read()
,write()
иfileno()
(хотя существуют тонкие различия между обычной семантикой чтения/записи Unix и семантикой аудиоустройств OSS). Он также поддерживает ряд специфических для аудио методов; полный список методов приведен ниже.device - имя файла аудиоустройства для использования. Если оно не указано, модуль сначала ищет устройство для использования в переменной окружения
AUDIODEV
. Если устройство не найдено, он возвращается к переменной/dev/dsp
.mode - один из
'r'
для доступа только для чтения (запись),'w'
для доступа только для записи (воспроизведение) и'rw'
для обоих режимов. Поскольку многие звуковые карты позволяют одному процессу одновременно иметь открытый рекордер или плеер, хорошей идеей будет открывать устройство только для необходимых действий. Кроме того, некоторые звуковые карты являются полудуплексными: они могут быть открыты для чтения или записи, но не для обеих операций одновременно.Обратите внимание на необычный синтаксис вызова: первый аргумент является необязательным, а второй - обязательным. Это исторический артефакт для совместимости со старым модулем
linuxaudiodev
, который заменяетossaudiodev
.
-
ossaudiodev.
openmixer
([device])¶ Открыть устройство микшера и вернуть объект устройства микшера OSS. device - это имя файла устройства микшера, которое нужно использовать. Если оно не указано, модуль сначала ищет устройство для использования в переменной окружения
MIXERDEV
. Если она не найдена, он возвращается к переменной/dev/mixer
.
Объекты аудиоустройств¶
Прежде чем записывать на аудиоустройство или читать с него, необходимо вызвать три метода в правильном порядке:
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)¶ Записать bytes-like object данные в аудиоустройство и вернуть количество записанных байт. Если аудиоустройство находится в блокирующем режиме (по умолчанию), то всегда записываются все данные (опять же, это отличается от обычной семантики устройств Unix). Если устройство находится в неблокирующем режиме, некоторые данные могут быть не записаны - см.
writeall()
.Изменено в версии 3.5: Теперь допускается запись bytes-like object.
-
oss_audio_device.
writeall
(data)¶ Записать bytes-like object data в аудиоустройство: ждет, пока аудиоустройство сможет принять данные, записывает столько данных, сколько оно сможет принять, и повторяет, пока data не будет полностью записана. Если устройство находится в блокирующем режиме (по умолчанию), это имеет тот же эффект, что и
write()
;writeall()
полезно только в неблокирующем режиме. Не имеет возвращаемого значения, так как количество записанных данных всегда равно количеству предоставленных данных.Изменено в версии 3.5: Теперь допускается запись bytes-like object.
Изменено в версии 3.2: Объекты аудиоустройств также поддерживают протокол управления контекстом, т.е. их можно использовать в операторе with
.
Каждый из следующих методов соответствует ровно одному системному вызову ioctl()
. Соответствие очевидно: например, setfmt()
соответствует иокключу SNDCTL_DSP_SETFMT
, а 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, определенный Ассоциацией интерактивного мультимедиа
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-битное аудио с малым эндианом
AFMT_U16_BE
Беззнаковый, 16-битный big-endian звук
Полный список аудиоформатов приведен в документации OSS, при этом следует учитывать, что большинство устройств поддерживают только часть этих форматов. Некоторые старые устройства поддерживают только
AFMT_U8
; наиболее распространенным форматом, используемым сегодня, являетсяAFMT_S16_LE
.
-
oss_audio_device.
setfmt
(format)¶ Попытаться установить текущий аудиоформат в формат - см. список в
getfmts()
. Возвращает аудиоформат, на который было настроено устройство, который может не совпадать с запрошенным форматом. Может также использоваться для возврата текущего аудиоформата – для этого нужно передать «audio format» в форматеAFMT_QUERY
.
-
oss_audio_device.
channels
(nchannels)¶ Установите количество выходных каналов nchannels. Значение 1 означает монофонический звук, 2 - стереофонический. Некоторые устройства могут иметь более 2 каналов, а некоторые устройства высокого класса могут не поддерживать монофонический звук. Возвращает количество каналов, на которое было настроено устройство.
-
oss_audio_device.
speed
(samplerate)¶ Попытка установить частоту дискретизации звука в samplerate выборок в секунду. Возвращает фактически установленную частоту. Большинство звуковых устройств не поддерживают произвольную частоту дискретизации. Распространенными частотами являются:
Тариф
Описание
8000
ставка по умолчанию для
/dev/audio
11025
запись речи
22050
44100
Аудио CD качества (при 16 бит/выборка и 2 каналах)
96000
Аудио DVD-качества (при 24 бит/сэмпл)
-
oss_audio_device.
sync
()¶ Подождите, пока звуковое устройство не воспроизведет все байты в своем буфере. (Это происходит неявно при закрытии устройства.) Документация OSS рекомендует закрывать и снова открывать устройство, а не использовать
sync()
.
-
oss_audio_device.
reset
()¶ Немедленно прекратите воспроизведение или запись и верните устройство в состояние, в котором оно может принимать команды. Документация OSS рекомендует закрывать и снова открывать устройство после вызова
reset()
.
-
oss_audio_device.
post
()¶ Сообщите драйверу, что в выводе, вероятно, будет пауза, что позволит устройству более разумно обработать паузу. Это можно использовать после воспроизведения точечного звукового эффекта, перед ожиданием пользовательского ввода или перед выполнением дискового ввода-вывода.
Следующие удобные методы объединяют несколько иоктлов или один иоктл и некоторые простые вычисления.
-
oss_audio_device.
setparameters
(format, nchannels, samplerate[, strict=False])¶ Установка ключевых параметров аудиосэмплирования - формата сэмплирования, количества каналов и частоты дискретизации - в одном вызове метода. формат, 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_*
, определенные на уровне модуля. Чтобы определить, например, поддерживает ли текущий объект микшера PCM-микшер, используйте следующий код Python:mixer=ossaudiodev.openmixer() if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): # PCM is supported ... code ...
Для большинства целей достаточно регуляторов
SOUND_MIXER_VOLUME
(мастер-громкость) иSOUND_MIXER_PCM
- но код, использующий микшер, должен быть гибким при выборе регуляторов микшера. В Gravis Ultrasound, например,SOUND_MIXER_VOLUME
не существует.
-
oss_mixer_device.
stereocontrols
()¶ Возвращает битовую маску, указывающую на стереофонические элементы управления микшером. Если бит установлен, соответствующий элемент управления является стереофоническим; если бит не установлен, элемент управления либо монофонический, либо не поддерживается микшером (используйте в комбинации с
controls()
для определения).Пример получения данных из битовой маски см. в примере кода для функции
controls()
.
-
oss_mixer_device.
reccontrols
()¶ Возвращает битовую маску, указывающую элементы управления микшером, которые могут быть использованы для записи. Пример чтения из битовой маски см. в примере кода для
controls()
.
-
oss_mixer_device.
get
(control)¶ Возвращает громкость заданного регулятора микшера. Возвращаемая громкость представляет собой кортеж
(left_volume,right_volume)
. Громкость задается в виде чисел от 0 (тишина) до 100 (полная громкость). Если регулятор монофонический, возвращается кортеж из двух чисел, но обе громкости будут одинаковыми.Вызывает сообщение
OSSAudioError
, если указан недопустимый элемент управления, илиOSError
, если указан неподдерживаемый элемент управления.
-
oss_mixer_device.
set
(control, (left, right))¶ Устанавливает громкость для данного регулятора микшера в значение
(left,right)
.left
иright
должны быть интами и находиться в диапазоне от 0 (тишина) до 100 (полная громкость). В случае успеха новая громкость возвращается в виде кортежа. Обратите внимание, что она может не полностью совпадать с заданной громкостью из-за ограниченного разрешения микшеров некоторых звуковых карт.Вызывает сообщение
OSSAudioError
, если был указан неверный элемент управления микшером или если указанные объемы выходят за пределы диапазона.
-
oss_mixer_device.
get_recsrc
()¶ Этот метод возвращает битовую маску, указывающую, какой элемент(ы) управления в настоящее время используется в качестве источника записи.
-
oss_mixer_device.
set_recsrc
(bitmask)¶ Вызовите эту функцию для указания источника записи. Возвращает битовую маску, указывающую новый источник записи (или источники) в случае успеха; выдает
OSError
, если был указан недопустимый источник. Чтобы установить текущим источником записи микрофонный вход:mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)