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


Модуль позволяет получить доступ к звуковому интерфейсу OSS (Open Sound System). OSS доступен для широкого спектра Unices с открытым исходным кодом и является стандартным звуковым интерфейсом для Linux и последних версий FreeBSD.

Изменено в версии 3.3: Операции в этом модуле теперь поднимают OSError там, где IOError был поднят.

См.также

Руководство программиста Open Sound System
официальная документация для 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' для обоих. Поскольку многие звуковые карты позволяют только одному процессу открывать записывающее устройство или проигрыватель одновременно, рекомендуется открывать устройство только для необходимой активности. Далее некоторые звуковые карты полудуплексные: их можно открыть для чтения или письма, но не оба сразу.

Обратите внимание на необычный синтаксис вызова: аргумент first необязателен, а второй требуется. Это - исторический артефакт для совместимости с более старым модулем 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)

Записать байтоподобный объект 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 (IMA)
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)

Попробуйте установить текущий аудиоформат в format — см. getfmts() для списка. Возвращает аудиоформат устройства, который может не быть запрошенным форматом. Может быть также используемый для возвращает текущего аудио формата — делается это путем передачи «аудиоформата» AFMT_QUERY.

oss_audio_device.channels(nchannels)

Установите количество выходных каналов равным nchannels. A значение 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()

Сообщите водителю, что в выводе может быть пауза, что позволит устройству более интеллектуально обрабатывать паузу. Это можно использовать после воспроизведения точечного звукового эффекта, перед ожиданием ввода данных пользователем или перед выполнением I/O диска.

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

Режим I/O для файла "r", "rw" или "w".

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

Объект микшера предоставляет два файловых метода:

oss_mixer_device.close()

Этот метод закрывает открытый файл микшерного устройства. Любые дальнейшие попытки использования смесителя после закрытия этого файла вызовут OSError.

oss_mixer_device.fileno()

Возвращает номер дескриптора файла открытого микшерного устройства.

Изменено в версии 3.2: Объекты микшера также поддерживают протокол управления контекст.

Остальные способы специфичны для микширования звука:

oss_mixer_device.controls()

Этот метод возвращает bitmask определение доступных средств управления миксером («Контроль», являющийся определенным mixable «каналом», таких как SOUND_MIXER_PCM или SOUND_MIXER_SYNTH). Этот bitmask указывает на подмножество всех доступных констант управления — SOUND_MIXER_* миксера, определенных на уровне модуля. Чтобы определить, поддерживает ли текущий объект микшера микшер PCM, используйте следующий Python код:

mixer=ossaudiodev.openmixer()
if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM):
    # PCM поддерживается
    ... код ...

В большинстве целей SOUND_MIXER_VOLUME (основной объем) и средства управления SOUND_MIXER_PCM должено хватать — но код, который использует миксер, должно быть гибким когда дело доходит до выбора средств управления миксером. На Gravis Ultrasound, например, SOUND_MIXER_VOLUME не существует.

oss_mixer_device.stereocontrols()

Возвращает битовая маска, указывающая средства управления стереомикшером. Если бит установлен, соответствующее управление является стерео; если он не установлен, управление либо монофоническое, либо не поддерживается миксером (используйте в сочетании с controls(), чтобы определить, какой).

Посмотрите пример код для функции controls() для примера получения данных из bitmask.

oss_mixer_device.reccontrols()

Возвращает битовую маску, определяющую элементы управления микшера, которые могут быть используемый для записи. Посмотрите пример код для controls() для примера чтения от bitmask.

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)