ossaudiodev — Доступ к аудиоустройствам, совместимым с OSS

Утратил актуальность с версии 3.11, будет удален в версии 3.13: Модуль ossaudiodev устарел (подробнее см. PEP 594).


Этот модуль позволяет вам получить доступ к аудиоинтерфейсу OSS (Open Sound System). OSS доступен для широкого спектра программ с открытым исходным кодом и коммерческих устройств и является стандартным аудиоинтерфейсом для 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.)

(Для обеспечения обратной совместимости класс 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.

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

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

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

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

  3. 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/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()

Сообщите драйверу, что, скорее всего, в выводе будет пауза, что позволит устройству более разумно использовать паузу. Вы можете использовать это после воспроизведения звукового эффекта, перед ожиданием ввода данных пользователем или перед выполнением операций ввода-вывода с диска.

Следующие удобные методы сочетают в себе несколько 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)
Вернуться на верх