Документация Python неофициальный перевод

ossaudiodev.md

327 строк · 24.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/ossaudiodev.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.9. `ossaudiodev` – Доступ к совместимым с OSS аудиоустройствам89*Платформы:* Linux, FreeBSD1011Этот модуль предоставляет доступ к аудиоинтерфейсу OSS (Open Sound System). OSS поддерживается многими системами Unix – как с открытым исходным кодом, так и коммерческими – и является стандартным аудиоинтерфейсом для Linux и последних версий FreeBSD.1213> **См. также**14>15> **[Руководство программиста Open Sound System](https://python-all.ru/3.1/library/ossaudiodev.html)**16>17> официальная документация для OSS C API18>19> Модуль определяет большое количество констант, предоставляемых драйвером устройств OSS; список можно найти в `<sys/soundcard.h>` на Linux или FreeBSD.2021`ossaudiodev` определяет следующие переменные и функции:2223#### `exception ossaudiodev.OSSAudioError`2425Это исключение вызывается при определенных ошибках. Аргументом является строка, описывающая, что пошло не так.2627(Если `ossaudiodev` получает от системного вызова ошибку – например, `open()`, `write()` или `ioctl()`, – он возбуждает [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError). Ошибки, обнаруженные непосредственно `ossaudiodev`, вызывают [`OSSAudioError`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.OSSAudioError).)2829(Для обратной совместимости класс исключения также доступен как `ossaudiodev.error`.)3031#### `ossaudiodev.open([device], mode)`3233Открывает аудиоустройство и возвращает объект аудиоустройства OSS. Этот объект поддерживает множество методов, подобных файловым, таких как `read()`, `write()` и `fileno()` (хотя существуют тонкие различия между семантикой чтения/записи в обычных Unix и в аудиоустройствах OSS). Также поддерживается ряд методов, специфичных для аудио; полный список методов приведён ниже.3435*device* – имя файла аудиоустройства. Если оно не указано, этот модуль сначала ищет устройство в переменной окружения **AUDIODEV**. Если не найдено, используется `/dev/dsp`.3637*mode* – одно из значений `'r'` для доступа только на чтение (запись), `'w'` для доступа только на запись (воспроизведение) и `'rw'` для обоих. Поскольку многие звуковые карты позволяют открыть устройство записи или воспроизведения только одному процессу, рекомендуется открывать устройство только для нужного действия. Кроме того, некоторые звуковые карты являются полудуплексными: их можно открыть для чтения или записи, но не одновременно.3839Обратите внимание на необычный синтаксис вызова: *первый* аргумент необязательный, а второй обязателен. Это исторический артефакт для совместимости со старым модулем `linuxaudiodev`, который заменён модулем `ossaudiodev`.4041#### `ossaudiodev.openmixer([device])`4243Открывает микшерное устройство и возвращает объект микшерного устройства OSS.4445*device*4647– имя файла микшерного устройства. Если оно не указано, модуль сначала ищет устройство в переменной окружения4849**MIXERDEV**5051. Если не найдено, используется5253`/dev/mixer`5455.5657## 21.9.1. Объекты аудиоустройств5859Перед записью или чтением с аудиоустройства необходимо вызвать три метода в правильном порядке:60611. `setfmt()` для установки формата вывода622. `channels()` для установки количества каналов633. `speed()` для установки частоты дискретизации6465В качестве альтернативы можно использовать метод `setparameters()` для установки всех трёх аудиопараметров одновременно. Это удобнее, но может быть не так гибко во всех случаях.6667Объекты аудиоустройства, возвращаемые [`open()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.open), определяют следующие методы и (доступные только для чтения) атрибуты:6869#### `oss_audio_device.close()`7071Явно закрывает аудиоустройство. После завершения записи или чтения с аудиоустройства его следует явно закрыть. Закрытое устройство нельзя использовать повторно.7273#### `oss_audio_device.fileno()`7475Возвращает файловый дескриптор, связанный с устройством.7677#### `oss_audio_device.read(size)`7879Читает8081*size*8283байт из аудиовхода и возвращает их в виде строки Python. В отличие от большинства драйверов устройств Unix, аудиоустройства OSS в блокирующем режиме (по умолчанию) будут блокировать8485[`read()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.read)8687, пока не будет доступен весь запрошенный объём данных.8889#### `oss_audio_device.write(data)`9091Записывает строку Python9293*data*9495в аудиоустройство и возвращает количество записанных байт. Если аудиоустройство находится в блокирующем режиме (по умолчанию), всегда записывается вся строка (опять же, это отличается от обычной семантики устройств Unix). Если устройство находится в неблокирующем режиме, часть данных может быть не записана – см.9697[`writeall()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.writeall)9899.100101#### `oss_audio_device.writeall(data)`102103Записывает всю строку Python104105*data*106107в аудиоустройство: ожидает, пока устройство сможет принять данные, записывает столько, сколько оно готово принять, и повторяет, пока108109*data*110111не будет полностью записана. Если устройство находится в блокирующем режиме (по умолчанию), этот метод действует так же, как112113[`write()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.write)114115;116117[`writeall()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.writeall)118119полезен только в неблокирующем режиме. Не возвращает значения, поскольку объём записанных данных всегда равен объёму переданных данных.120121Следующие методы сопоставляются ровно с одним системным вызовом `ioctl()`. Соответствие очевидно: например, `setfmt()` соответствует ioctl `SNDCTL_DSP_SETFMT`, а `sync()``SNDCTL_DSP_SYNC` (это может быть полезно при обращении к документации OSS). Если базовый `ioctl()` завершается ошибкой, все они возбуждают [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError).122123#### `oss_audio_device.nonblock()`124125Переводит устройство в неблокирующий режим. После перехода в неблокирующий режим вернуть его в блокирующий невозможно.126127#### `oss_audio_device.getfmts()`128129Возвращает битовую маску форматов аудиовыхода, поддерживаемых звуковой картой. Некоторые из форматов, поддерживаемых OSS:130131| Формат | Описание |132| --- | --- |133| `AFMT_MU_LAW` | логарифмическое кодирование (используется в файлах `.au` от Sun и в `/dev/audio`) |134| `AFMT_A_LAW` | логарифмическое кодирование |135| `AFMT_IMA_ADPCM` | сжатый формат 4:1, определённый Ассоциацией интерактивного мультимедиа |136| `AFMT_U8` | Беззнаковое 8-битное аудио |137| `AFMT_S16_LE` | Знаковое 16-битное аудио с порядком байтов от младшего к старшему (используется процессорами Intel) |138| `AFMT_S16_BE` | Знаковое 16-битное аудио с порядком байтов от старшего к младшему (используется 68k, PowerPC, Sparc) |139| `AFMT_S8` | Знаковое 8-битное аудио |140| `AFMT_U16_LE` | Беззнаковое 16-битное аудио с порядком от младшего к старшему |141| `AFMT_U16_BE` | Беззнаковое 16-битное аудио с порядком от старшего к младшему |142143Обратитесь к документации OSS для получения полного списка аудиоформатов и учтите, что большинство устройств поддерживают только часть этих форматов. Некоторые старые устройства поддерживают только `AFMT_U8`; наиболее распространённый формат, используемый сегодня, – `AFMT_S16_LE`.144145#### `oss_audio_device.setfmt(format)`146147Пытается установить текущий аудиоформат в148149*format*150151– см.152153[`getfmts()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.getfmts)154155для списка. Возвращает аудиоформат, который был установлен на устройстве; он может не совпадать с запрошенным форматом. Также может использоваться для возврата текущего аудиоформата – для этого передайте «аудиоформат»156157`AFMT_QUERY`158159.160161#### `oss_audio_device.channels(nchannels)`162163Устанавливает количество выходных каналов в164165*nchannels*166167. Значение 1 означает монофонический звук, 2 – стереофонический. Некоторые устройства могут иметь более 2 каналов, а некоторые высококлассные устройства могут не поддерживать моно. Возвращает количество каналов, которое было установлено.168169#### `oss_audio_device.speed(samplerate)`170171Пытается установить частоту дискретизации аудио в *samplerate* отсчётов в секунду. Возвращает фактически установленную частоту. Большинство звуковых устройств не поддерживают произвольные частоты дискретизации. Распространённые частоты:172173| Частота | Описание |174| --- | --- |175| 8000 | частота по умолчанию для `/dev/audio` |176| 11025 | запись речи |177| 22050 |  |178| 44100 | аудио качества CD (16 бит/отсчёт, 2 канала) |179| 96000 | аудио качества DVD (24 бита/отсчёт) |180181#### `oss_audio_device.sync()`182183Ожидает, пока звуковое устройство воспроизведёт все байты в своём буфере. (Это происходит неявно при закрытии устройства.) Документация OSS рекомендует закрывать и открывать устройство заново, а не использовать184185[`sync()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.sync)186187.188189#### `oss_audio_device.reset()`190191Немедленно прекращает воспроизведение или запись и возвращает устройство в состояние, в котором оно может принимать команды. Документация OSS рекомендует закрыть и открыть устройство заново после вызова192193[`reset()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.reset)194195.196197#### `oss_audio_device.post()`198199Уведомляет драйвер о вероятной паузе в выводе, чтобы устройство могло более разумно обработать эту паузу. Этот метод можно использовать после воспроизведения короткого звукового эффекта, перед ожиданием ввода от пользователя или перед выполнением дискового ввода-вывода.200201Следующие удобные методы объединяют несколько ioctl или один ioctl и несколько простых вычислений.202203#### `oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])`204205Устанавливает ключевые параметры аудиосэмплирования – формат сэмпла, количество каналов и частоту сэмплирования – одним вызовом метода. *format*, *nchannels* и *samplerate* должны быть такими, как указано в методах [`setfmt()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.setfmt), [`channels()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.channels) и [`speed()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.speed). Если *strict* равен True, [`setparameters()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.setparameters) проверяет, был ли каждый параметр действительно установлен в запрошенное значение, и в противном случае возбуждает [`OSSAudioError`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.OSSAudioError). Возвращает кортеж (*format*, *nchannels*, *samplerate*), указывающий значения параметров, которые были фактически установлены драйвером устройства (т.е. те же, что и возвращаемые значения [`setfmt()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.setfmt), [`channels()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.channels) и [`speed()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_audio_device.speed)).206207Например,208209```python210(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)211```212213эквивалентна214215```python216fmt = dsp.setfmt(fmt)217channels = dsp.channels(channels)218rate = dsp.rate(channels)219```220221#### `oss_audio_device.bufsize()`222223Возвращает размер аппаратного буфера в сэмплах.224225#### `oss_audio_device.obufcount()`226227Возвращает количество сэмплов, которые ещё находятся в аппаратном буфере и ожидают воспроизведения.228229#### `oss_audio_device.obuffree()`230231Возвращает количество сэмплов, которые можно поместить в аппаратный буфер для воспроизведения без блокировки.232233Объекты аудиоустройств также поддерживают несколько атрибутов только для чтения:234235#### `oss_audio_device.closed`236237Логическое значение, указывающее, было ли устройство закрыто.238239#### `oss_audio_device.name`240241Строка, содержащая имя файла устройства.242243#### `oss_audio_device.mode`244245Режим ввода-вывода для файла:246247`"r"`248249,250251`"rw"`252253или254255`"w"`256257.258259## 21.9.2. Объекты устройства микшера260261Объект микшера предоставляет два метода, похожих на файловые:262263#### `oss_mixer_device.close()`264265Этот метод закрывает открытый файл устройства микшера. Любые дальнейшие попытки использовать микшер после закрытия этого файла вызовут исключение266267[`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError)268269.270271#### `oss_mixer_device.fileno()`272273Возвращает номер файлового дескриптора открытого файла микшерного устройства.274275Оставшиеся методы относятся к аудио-микшированию:276277#### `oss_mixer_device.controls()`278279Этот метод возвращает битовую маску, определяющую доступные контролы микшера (под «Control» понимается конкретный микшируемый «канал», например `SOUND_MIXER_PCM` или `SOUND_MIXER_SYNTH`). Эта битовая маска указывает подмножество всех доступных контролов микшера – константы `SOUND_MIXER_*`, определённые на уровне модуля. Чтобы определить, поддерживает ли текущий объект микшера, например, микшер PCM, используйте следующий код Python:280281```python282mixer=ossaudiodev.openmixer()283if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM):284    # PCM поддерживается285    ... code ...286```287288Для большинства задач достаточно контролов `SOUND_MIXER_VOLUME` (основная громкость) и `SOUND_MIXER_PCM`, но код, использующий микшер, должен быть гибким в выборе контролов. Например, на Gravis Ultrasound `SOUND_MIXER_VOLUME` не существует.289290#### `oss_mixer_device.stereocontrols()`291292Возвращает битовую маску, указывающую стереоконтролы микшера. Если бит установлен, соответствующий контрол стереофонический; если сброшен – контрол либо монофонический, либо не поддерживается микшером (используйте совместно с [`controls()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_mixer_device.controls), чтобы определить, какой именно).293294Смотрите пример кода для функции [`controls()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_mixer_device.controls), где показано, как получать данные из битовой маски.295296#### `oss_mixer_device.reccontrols()`297298Возвращает битовую маску, определяющую контролы микшера, которые можно использовать для записи. Смотрите пример кода для299300[`controls()`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.oss_mixer_device.controls)301302, где показано, как читать битовую маску.303304#### `oss_mixer_device.get(control)`305306Возвращает громкость заданного контрола микшера. Возвращаемая громкость – это кортеж из двух элементов `(left_volume,right_volume)`. Значения громкости задаются числами от 0 (тишина) до 100 (полная громкость). Если контрол монофонический, всё равно возвращается кортеж из двух элементов, но обе громкости одинаковы.307308Вызывает [`OSSAudioError`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.OSSAudioError), если указан недопустимый элемент управления, или [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError), если указан неподдерживаемый элемент управления.309310#### `oss_mixer_device.set(control, (left, right))`311312Устанавливает громкость для заданного контрола микшера в значение `(left,right)`. `left` и `right` должны быть целыми числами от 0 (тишина) до 100 (полная громкость). В случае успеха новая громкость возвращается в виде кортежа из двух элементов. Обратите внимание, что она может не точно совпадать с заданной из-за ограниченного разрешения микшеров некоторых звуковых карт.313314Возбуждает [`OSSAudioError`](https://python-all.ru/3.1/library/ossaudiodev.html#ossaudiodev.OSSAudioError), если указан недопустимый контрол микшера или если указанные значения громкости выходят за допустимый диапазон.315316#### `oss_mixer_device.get_recsrc()`317318Этот метод возвращает битовую маску, указывающую, какие регуляторы в данный момент используются как источник записи.319320#### `oss_mixer_device.set_recsrc(bitmask)`321322Вызовите эту функцию, чтобы указать источник записи. Возвращает битовую маску, указывающую новый источник (или источники) записи в случае успеха; вызывает [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError), если указан недопустимый источник. Чтобы установить текущий источник записи на вход микрофона:323324```python325mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)326```327