# `ossaudiodev` — Acceso a dispositivos de audio compatibles con OSS

Obsoleto desde la versión 3.11, se eliminará en la versión 3.13: El módulo `ossaudiodev` está deprecado (vea PEP 594 para más detalles).

Este módulo le permite acceder a la interfaz de audio OSS (Open Sound System). OSS está disponible para una amplia gama de Unices comerciales y de código abierto, y es la interfaz de audio estándar para Linux y versiones recientes de FreeBSD.

Distinto en la versión 3.3: Las operaciones en este módulo ahora generan `OSError` donde `IOError`` es generado.

Ver también

Open Sound System Programmer’s Guide

  la documentación oficial de la API de OSS C

El módulo define una gran cantidad de constantes suministradas por el controlador de dispositivo OSS; consulte `<sys/soundcard.h>` en Linux o FreeBSD para obtener un listado.

`ossaudiodev` define las siguientes variables y funciones:

exception ossaudiodev.OSSAudioError

  Esta excepción se genera en ciertos errores. El argumento es una cadena que describe qué salió mal.

  (Si `ossaudiodev`` recibe un error de una llamada al sistema como `open()`, `write()`, o `ioctl()`, genera `OSError`. Los errores detectados directamente por `ossaudiodev` dan como resultado `OSSAudioError`.)

  (Para compatibilidad con versiones anteriores, la clase de excepción también está disponible como `ossaudiodev.error`.)

ossaudiodev.open(mode)
ossaudiodev.open(device, mode)

  Abra un dispositivo de audio y retorne un objeto de dispositivo de audio OSS. Este objeto admite muchos métodos similares a archivos, como `read()`, `write()`, and `fileno()` (aunque existen diferencias sutiles entre la semántica de lectura/escritura convencional de Unix y la de audio OSS dispositivos). También es compatible con varios métodos específicos de audio; vea a continuación la lista completa de métodos.

  device es el nombre de archivo del dispositivo de audio que se utilizará. Si no se especifica, este módulo primero busca en la variable de entorno `AUDIODEV` para un dispositivo a usar. Si no se encuentra, vuelve a `/dev/dsp`.

  mode es uno de `’r’` para acceso de solo lectura (grabación), `’w’` para acceso de solo escritura (reproducción) y `’rw’` para ambos. Dado que muchas tarjetas de sonido solo permiten que un proceso tenga la grabadora o el reproductor abiertos a la vez, es una buena idea abrir el dispositivo solo para la actividad necesaria. Además, algunas tarjetas de sonido son semidúplex: se pueden abrir para leer o escribir, pero no ambas a la vez.

  Tenga en cuenta la sintaxis de llamada inusual: el first argumento es opcional y el segundo es obligatorio. Este es un artefacto histórico para la compatibilidad con el módulo anterior `linuxaudiodev` que `ossaudiodev` reemplaza.

ossaudiodev.openmixer([device])

  Abra un dispositivo mezclador y retorne un objeto de dispositivo mezclador OSS. device es el nombre de archivo del dispositivo mezclador que se utilizará. Si no se especifica, este módulo primero busca en la variable de entorno `MIXERDEV` para usar un dispositivo. Si no se encuentra, vuelve a `/dev/mixer`.

## Objetos de dispositivo de audio

Antes de poder escribir o leer desde un dispositivo de audio, debe llamar a tres métodos en el orden correcto:

1. `setfmt()` para configurar el formato de salida

2. `channels()` para configurar el número de canales

3. `speed()` para configurar la frecuencia de muestreo

Alternativamente, puede usar el método `setparameters()` para configurar los tres parámetros de audio a la vez. Esto es más conveniente, pero puede que no sea tan flexible en todos los casos.

Los objetos de dispositivo de audio retornados por `open()` definen los siguientes métodos y atributos (de solo lectura):

oss_audio_device.close()

  Cierre explícitamente el dispositivo de audio. Cuando haya terminado de escribir o leer desde un dispositivo de audio, debe cerrarlo explícitamente. Un dispositivo cerrado no se puede volver a utilizar.

oss_audio_device.fileno()

  Retorna el descriptor de archivo asociado con el dispositivo.

oss_audio_device.read(size)

  Leer size bytes de la entrada de audio y retornarlos como una cadena de Python. A diferencia de la mayoría de los controladores de dispositivos Unix, los dispositivos de audio OSS en modo de bloqueo (el predeterminado) bloquearán `read()` hasta que esté disponible toda la cantidad de datos solicitada.

oss_audio_device.write(data)

  Escriba un bytes-like object data en el dispositivo de audio y retorne el número de bytes escritos. Si el dispositivo de audio está en modo de bloqueo (el predeterminado), todos los datos siempre se escriben (nuevamente, esto es diferente de la semántica habitual del dispositivo Unix). Si el dispositivo está en modo sin bloqueo, es posible que algunos datos no se escriban—see `writeall()`.

  Distinto en la versión 3.5: Ahora se aceptan objetos con permisos de escritura con formato bytes-like object.

oss_audio_device.writeall(data)

  Escriba un bytes-like object data en el dispositivo de audio: espera hasta que el dispositivo de audio sea capaz de aceptar datos, escribe tantos datos como acepte y repite hasta que data se hayan escrito por completo. Si el dispositivo está en modo de bloqueo (el predeterminado), esto tiene el mismo efecto que `write()`; `writeall()` solo es útil en el modo sin bloqueo. No tiene valor de retorno, ya que la cantidad de datos escritos siempre es igual a la cantidad de datos suministrados.

  Distinto en la versión 3.5: Ahora se aceptan objetos con permisos de escritura con formato bytes-like object.

Distinto en la versión 3.2: Los objetos de dispositivo de audio también admiten el protocolo de gestión de contexto, es decir, se pueden utilizar en una declaración `with`.

Los siguientes métodos se asignan exactamente a una llamada al sistema `ioctl()`. La correspondencia es obvia: por ejemplo, `setfmt()` corresponde al `SNDCTL_DSP_SETFMT` ioctl, y `sync()` a `SNDCTL_DSP_SYNC` (esto puede ser útil cuando se consulta la documentación de OSS). Si el subyacente `ioctl()` falla, todos generan `OSError`.

oss_audio_device.nonblock()

  Ponga el dispositivo en modo sin bloqueo. Una vez en el modo sin bloqueo, no hay forma de volverlo al modo de bloqueo.

oss_audio_device.getfmts()

  Retorna una máscara de bits de los formatos de salida de audio admitidos por la tarjeta de sonido. Algunos de los formatos admitidos por OSS son:

  Formato | Descripción
  --- | ---
  `AFMT_MU_LAW` | una codificación logarítmica (utilizada por los archivos Sun `.au` y `/dev/audio`)
  `AFMT_A_LAW` | una codificación logarítmica
  `AFMT_IMA_ADPCM` | un formato comprimido 4:1 definido por la Interactive Multimedia Association
  `AFMT_U8` | Audio de 8 bits sin firmar
  `AFMT_S16_LE` | Orden de bytes little-endian firmado, audio de 16 bits (como lo utilizan los procesadores Intel)
  `AFMT_S16_BE` | Orden de bytes big-endian firmado, audio de 16 bits (como lo utilizan 68k, PowerPC, Sparc)
  `AFMT_S8` | Firmado, audio de 8 bits
  `AFMT_U16_LE` | Audio little-endian de 16 bits sin firmar
  `AFMT_U16_BE` | Audio big-endian de 16 bits sin firmar

  Consulte la documentación de OSS para obtener una lista completa de los formatos de audio y tenga en cuenta que la mayoría de los dispositivos solo admiten un subconjunto de estos formatos. Algunos dispositivos antiguos solo admiten `AFMT_U8`; el formato más común utilizado hoy en día es `AFMT_S16_LE`.

oss_audio_device.setfmt(format)

  Intente establecer el formato de audio actual en format—consulte `getfmts()` para obtener una lista. Retorna el formato de audio en el que se configuró el dispositivo, que puede no ser el formato solicitado. También se puede utilizar para retornar el formato de audio actual. Haga esto pasando un «formato de audio» de `AFMT_QUERY`.

oss_audio_device.channels(nchannels)

  Establezca el número de canales de salida en nchannels. Un valor de 1 indica sonido monofónico, 2 estereofónico. Algunos dispositivos pueden tener más de 2 canales y algunos dispositivos de gama alta pueden no admitir mono. Retorna el número de canales en los que se configuró el dispositivo.

oss_audio_device.speed(samplerate)

  Intente establecer la frecuencia de muestreo de audio en samplerate muestras por segundo. Retorna la tasa realmente establecida. La mayoría de los dispositivos de sonido no admiten frecuencias de muestreo arbitrarias. Las tarifas comunes son:

  Velocidad | Descripción
  --- | ---
  8000 | tasa predeterminada para `/dev/audio`
  11025 | grabación de voz
  22050 |
  44100 | Audio con calidad de CD (a 16 bits/muestra y 2 canales)
  96000 | Audio con calidad de DVD (a 24 bits/muestra)

oss_audio_device.sync()

  Espere hasta que el dispositivo de sonido haya reproducido todos los bytes de su búfer. (Esto sucede implícitamente cuando el dispositivo está cerrado). La documentación de OSS recomienda cerrar y volver a abrir el dispositivo en lugar de usar `sync()`.

oss_audio_device.reset()

  Deje de reproducir o grabar inmediatamente y retorne el dispositivo a un estado en el que pueda aceptar comandos. La documentación de OSS recomienda cerrar y volver a abrir el dispositivo después de llamar `reset()`.

oss_audio_device.post()

  Dígale al controlador que es probable que haya una pausa en la salida, lo que hace posible que el dispositivo maneje la pausa de manera más inteligente. Puede usar esto después de reproducir un efecto de sonido puntual, antes de esperar la entrada del usuario o antes de realizar E/S de disco.

Los siguientes métodos de conveniencia combinan varios ioctl, o un ioctl y algunos cálculos simples.

oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])

  Configure los parámetros clave de muestreo de audio (formato de muestra, número de canales y frecuencia de muestreo) en una llamada de método. format, nchannels, y samplerate deben ser como se especifica en los métodos `setfmt()`, `channels()`, y `speed()`. Si strict es verdadero, `setparameters()` comprueba si cada parámetro se estableció realmente en el valor solicitado, y genera `OSSAudioError` si no es así. Retorna una tupla (format, nchannels, samplerate) que indica los valores de los parámetros que realmente estableció el controlador del dispositivo (es decir, los mismos que los valores retornados de `setfmt()`, `channels()`, y `speed()`).

  Por ejemplo,

      (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)

  es equivalente a

      fmt = dsp.setfmt(fmt)
      channels = dsp.channels(channels)
      rate = dsp.rate(rate)

oss_audio_device.bufsize()

  Retorna el tamaño del búfer de hardware, en muestras.

oss_audio_device.obufcount()

  Retorna el número de muestras que están en el búfer de hardware que aún no se han reproducido.

oss_audio_device.obuffree()

  Retorna el número de muestras que se podrían poner en cola en el búfer de hardware para reproducirse sin bloqueos.

Los objetos de dispositivo de audio también admiten varios atributos de solo lectura:

oss_audio_device.closed

  Booleano que indica si el dispositivo se ha cerrado.

oss_audio_device.name

  Cadena que contiene el nombre del archivo del dispositivo.

oss_audio_device.mode

  El modo de E/S para el archivo, ya sea `"r"`, `"rw"`, o `"w"`.

## Objetos del dispositivo mezclador

El objeto del mezclador proporciona dos métodos similares a archivos:

oss_mixer_device.close()

  Este método cierra el archivo del dispositivo mezclador abierto. Cualquier otro intento de usar el mezclador después de que este archivo esté cerrado lanzará un `OSError`.

oss_mixer_device.fileno()

  Retorna el número de identificador de archivo del archivo del dispositivo mezclador abierto.

Distinto en la versión 3.2: Los objetos Mixer también admiten el protocolo de gestión de contexto.

Los métodos restantes son específicos para la mezcla de audio:

oss_mixer_device.controls()

  Este método retorna una máscara de bits que especifica los controles del mezclador disponibles («Control» es un «canal» mezclable específico, como `SOUND_MIXER_PCM` o `SOUND_MIXER_SYNTH`). Esta máscara de bits indica un subconjunto de todos los controles de mezclador disponibles — las constantes `SOUND_MIXER_*` definidas a nivel de módulo. Para determinar si, por ejemplo, el objeto mezclador actual admite un mezclador PCM, utilice el siguiente código Python:

      mixer=ossaudiodev.openmixer()
      if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM):
          # PCM is supported
          ... code ...

  Para la mayoría de los propósitos, los controles `SOUND_MIXER_VOLUME` (volumen maestro) y `SOUND_MIXER_PCM` deberían ser suficientes — pero el código que usa el mezclador debe ser flexible cuando se trata de elegir los controles del mezclador. En el Ultrasonido Gravis, por ejemplo, `SOUND_MIXER_VOLUME` no existe.

oss_mixer_device.stereocontrols()

  Retorna una máscara de bits que indica los controles del mezclador estéreo. Si se establece un bit, el control correspondiente es estéreo; si no está configurado, el control es monofónico o no es compatible con el mezclador (úselo en combinación con `controls()` para determinar cuál).

  Consulte el ejemplo de código de la función `controls()` para ver un ejemplo de cómo obtener datos de una máscara de bits.

oss_mixer_device.reccontrols()

  Retorna una máscara de bits que especifica los controles del mezclador que se pueden usar para grabar. Consulte el ejemplo de código de `controls()` para ver un ejemplo de lectura desde una máscara de bits.

oss_mixer_device.get(control)

  Retorna el volumen de un control de mezcla determinado. El volumen retornado es una tupla de 2 `(left_volume,right_volume)`. Los volúmenes se especifican como números del 0 (silencioso) al 100 (volumen completo). Si el control es monofónico, todavía se retorna una tupla de 2, pero ambos volúmenes son iguales.

  Genera `OSSAudioError` si se especifica un control no válido, o `OSError` si se especifica un control no admitido.

oss_mixer_device.set(control, (left, right))

  Establece el volumen para un control de mezclador dado en `(left,right)`. `left` y `right` deben ser enteros y estar entre 0 (silencio) y 100 (volumen completo). En caso de éxito, el nuevo volumen se retorna como 2 tuplas. Tenga en cuenta que puede que no sea exactamente el mismo que el volumen especificado, debido a la resolución limitada de algunos mezcladores de tarjetas de sonido.

  Aumenta `OSSAudioError` si se especificó un control de mezcla no válido, o si los volúmenes especificados estaban fuera de rango.

oss_mixer_device.get_recsrc()

  Este método retorna una máscara de bits que indica qué control(es) se están utilizando actualmente como fuente de grabación.

oss_mixer_device.set_recsrc(bitmask)

  Llame a esta función para especificar una fuente de grabación. Retorna una máscara de bits que indica la nueva fuente de grabación (o fuentes) si tiene éxito; plantea `OSError` si se especificó una fuente no válida. Para configurar la fuente de grabación actual a la entrada del micrófono:

      mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)