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.

Объекты аудиоустройств

Прежде чем записывать на аудиоустройство или читать с него, необходимо вызвать три метода в правильном порядке:

  1. setfmt() для установки формата вывода

  2. channels() для установки количества каналов

  3. 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)
Вернуться на верх