Содержание страницы
22.9. ossaudiodev – Доступ к OSS-совместимым аудиоустройствам¶ossaudiodev – Access to OSS-compatible audio devices
Этот модуль предоставляет доступ к аудиоинтерфейсу OSS (Open Sound System). OSS поддерживается многими системами Unix – как с открытым исходным кодом, так и коммерческими – и является стандартным аудиоинтерфейсом для 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' для обоих. Поскольку многие звуковые карты позволяют открыть устройство записи или воспроизведения только одному процессу, рекомендуется открывать устройство только для нужного действия. Кроме того, некоторые звуковые карты являются полудуплексными: их можно открыть для чтения или записи, но не одновременно.
Обратите внимание на необычный синтаксис вызова: первый аргумент необязательный, а второй обязателен. Это исторический артефакт для совместимости со старым модулем linuxaudiodev, вместо которого теперь используется ossaudiodev.
- ossaudiodev.openmixer([device])¶
Открывает микшерное устройство и возвращает объект микшера OSS. device – это имя файла микшерного устройства. Если оно не указано, этот модуль сначала ищет устройство в переменной окружения MIXERDEV. Если не найдено, используется /dev/mixer.
22.9.1. Объекты аудиоустройств¶Audio Device Objects
Перед записью или чтением с аудиоустройства необходимо вызвать три метода в правильном порядке:
- 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)¶
Записывает строку Python data в аудиоустройство и возвращает количество записанных байт. Если аудиоустройство находится в блокирующем режиме (по умолчанию), всегда записывается вся строка (опять же, это отличается от обычной семантики устройств Unix). Если устройство находится в неблокирующем режиме, часть данных может быть не записана – см. writeall().
- oss_audio_device.writeall(data)¶
Записывает всю строку Python data в аудиоустройство: ожидает, пока устройство сможет принять данные, записывает столько, сколько оно готово принять, и повторяет, пока data не будет полностью записана. Если устройство находится в блокирующем режиме (по умолчанию), этот метод действует так же, как write(); writeall() полезен только в неблокирующем режиме. Не возвращает значения, поскольку объём записанных данных всегда равен объёму переданных данных.
Изменено в версии 3.2: Объекты аудиоустройства также поддерживают протокол менеджера контекста, то есть их можно использовать в операторе with.
Следующие методы соответствуют ровно одному системному вызову ioctl(). Соответствие очевидно: например, setfmt() соответствует ioctl SNDCTL_DSP_SETFMT, а sync() – SNDCTL_DSP_SYNC (это может быть полезно при обращении к документации OSS). Если соответствующий ioctl() завершается неудачей, все они вызывают OSError.
- oss_audio_device.nonblock()¶
Переводит устройство в неблокирующий режим. После перехода в неблокирующий режим вернуть его в блокирующий невозможно.
- oss_audio_device.getfmts()¶
Возвращает битовую маску форматов аудиовыхода, поддерживаемых звуковой картой. Некоторые из форматов, поддерживаемых OSS:
Формат Описание AFMT_MU_LAW логарифмическое кодирование (используется в файлах .au от Sun и в /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".
22.9.2. Объекты микшерных устройств¶Mixer Device Objects
Объект микшера предоставляет два метода, похожих на файловые:
- 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 поддерживается ... 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)