ossaudiodev — OSS互換オーディオデバイスへのアクセス—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/ossaudiodev
移動先:案内検索

ossaudiodev —OSS互換オーディオデバイスへのアクセス


このモジュールを使用すると、OSS(Open Sound System)オーディオインターフェイスにアクセスできます。 OSSは、幅広いオープンソースおよび商用のUnicesで利用可能であり、Linuxおよび最近のバージョンのFreeBSDの標準オーディオインターフェイスです。

バージョン3.3で変更:このモジュールの操作で OSError が発生し、 IOError が発生しました。


も参照してください

オープンサウンドシステムプログラマーズガイド
OSS CAPIの公式ドキュメント

このモジュールは、OSSデバイスドライバーによって提供される多数の定数を定義します。 リストについては、LinuxまたはFreeBSDの<sys/soundcard.h>を参照してください。


ossaudiodev は、次の変数と関数を定義します。

exception ossaudiodev.OSSAudioError

この例外は、特定のエラーで発生します。 引数は、何が悪かったのかを説明する文字列です。

ossaudiodevopen()write()ioctl()などのシステムコールからエラーを受信すると、 OSError が発生します。 ossaudiodev によって直接検出されたエラーは、 OSSAudioError になります。)

(下位互換性のために、例外クラスはossaudiodev.errorとしても使用できます。)

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

オーディオデバイスを開き、OSSオーディオデバイスオブジェクトを返します。 このオブジェクトは、read()write()fileno()などの多くのファイルのようなメソッドをサポートします(ただし、従来のUnixの読み取り/書き込みセマンティクスとOSSオーディオのセマンティクスには微妙な違いがあります)デバイス)。 また、オーディオ固有の方法も多数サポートしています。 メソッドの完全なリストについては、以下を参照してください。

device は、使用するオーディオデバイスのファイル名です。 指定されていない場合、このモジュールは最初に環境変数 AUDIODEVで使用するデバイスを探します。 見つからない場合は、/dev/dspにフォールバックします。

モードは、読み取り専用(記録)アクセス用の'r'、書き込み専用(再生)アクセス用の'w'、および両方の'rw'のいずれかです。 多くのサウンドカードでは、一度に1つのプロセスでのみレコーダーまたはプレーヤーを開くことができるため、必要なアクティビティのためにのみデバイスを開くことをお勧めします。 さらに、一部のサウンドカードは半二重です。読み取りまたは書き込み用に開くことができますが、両方を同時に開くことはできません。

異常な呼び出し構文に注意してください。 first 引数はオプションであり、2番目は必須です。 これは、 ossaudiodev に取って代わる古いlinuxaudiodevモジュールとの互換性のための歴史的なアーティファクトです。

ossaudiodev.openmixer([device])
ミキサーデバイスを開き、OSSミキサーデバイスオブジェクトを返します。 device は、使用するミキサーデバイスのファイル名です。 指定されていない場合、このモジュールは最初に環境変数 MIXERDEVで使用するデバイスを探します。 見つからない場合は、/dev/mixerにフォールバックします。

オーディオデバイスオブジェクト

オーディオデバイスへの書き込みまたはオーディオデバイスからの読み取りを行う前に、次の3つのメソッドを正しい順序で呼び出す必要があります。

  1. setfmt()で出力フォーマットを設定します
  2. channels()でチャンネル数を設定します
  3. speed()でサンプルレートを設定します

または、setparameters()メソッドを使用して、3つのオーディオパラメーターすべてを一度に設定することもできます。 これはより便利ですが、すべての場合にそれほど柔軟ではない場合があります。

open()によって返されるオーディオデバイスオブジェクトは、次のメソッドと(読み取り専用)属性を定義します。

oss_audio_device.close()
オーディオデバイスを明示的に閉じます。 オーディオデバイスへの書き込みまたはオーディオデバイスからの読み取りが完了したら、明示的に閉じる必要があります。 閉じたデバイスを再度使用することはできません。
oss_audio_device.fileno()
デバイスに関連付けられているファイル記述子を返します。
oss_audio_device.read(size)
オーディオ入力から size バイトを読み取り、Python文字列として返します。 ほとんどのUnixデバイスドライバーとは異なり、ブロックモード(デフォルト)のOSSオーディオデバイスは、要求された量のデータがすべて利用可能になるまで、 read()をブロックします。
oss_audio_device.write(data)

バイトのようなオブジェクト データをオーディオデバイスに書き込み、書き込まれたバイト数を返します。 オーディオデバイスがブロッキングモード(デフォルト)の場合、データ全体が常に書き込まれます(これも、通常のUnixデバイスのセマンティクスとは異なります)。 デバイスが非ブロッキングモードの場合、一部のデータが書き込まれない可能性があります。 writeall()を参照してください。

バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。

oss_audio_device.writeall(data)

バイトのようなオブジェクト データをオーディオデバイスに書き込みます。オーディオデバイスがデータを受け入れることができるまで待機し、受け入れるだけのデータを書き込み、まで繰り返します。 data は完全に書き込まれています。 デバイスがブロッキングモード(デフォルト)の場合、これは write()と同じ効果があります。 writeall()は、非ブロッキングモードでのみ役立ちます。 書き込まれるデータの量は常に提供されるデータの量と等しいため、戻り値はありません。

バージョン3.5で変更:書き込み可能なバイトのようなオブジェクトが受け入れられるようになりました。

バージョン3.2で変更:オーディオデバイスオブジェクトは、コンテキスト管理プロトコルもサポートしています。 with ステートメントで使用できます。


次のメソッドはそれぞれ、正確に1つの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

Interactive Multimedia Associationによって定義された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)
現在のオーディオ形式を形式に設定してみてください。リストについては、 getfmts()を参照してください。 デバイスが設定されたオーディオ形式を返しますが、要求された形式ではない可能性があります。 現在のオーディオ形式を返すために使用することもできます。これを行うには、AFMT_QUERYの「オーディオ形式」を渡します。
oss_audio_device.channels(nchannels)
出力チャンネル数を nchannels に設定します。 値1はモノラルサウンド、2はステレオフォニックを示します。 一部のデバイスには3つ以上のチャネルがあり、一部のハイエンドデバイスはモノラルをサポートしていない場合があります。 デバイスが設定されたチャネルの数を返します。
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を実行する前に使用できます。

次の便利な方法は、複数のioctl、または1つのioctlといくつかの簡単な計算を組み合わせたものです。

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

1回のメソッド呼び出しで、主要なオーディオサンプリングパラメータ(サンプル形式、チャネル数、サンプリングレート)を設定します。 formatnchannels 、および samplerate は、 setfmt()channels()で指定されているとおりである必要があります。および speed()メソッド。 strict がtrueの場合、 setparameters()は、各パラメーターが実際に要求された値に設定されているかどうかを確認し、設定されていない場合は OSSAudioError を発生させます。 デバイスドライバーによって実際に設定されたパラメーター値を示すタプル( formatnchannelssamplerate )を返します(つまり、の戻り値と同じ) 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"のいずれかのファイルのI / Oモード。


ミキサーデバイスオブジェクト

ミキサーオブジェクトは、2つのファイルのようなメソッドを提供します。

oss_mixer_device.close()
このメソッドは、開いているミキサーデバイスファイルを閉じます。 このファイルを閉じた後にミキサーを使用しようとすると、 OSError が発生します。
oss_mixer_device.fileno()
開いているミキサーデバイスファイルのファイルハンドル番号を返します。

バージョン3.2で変更: Mixerオブジェクトはコンテキスト管理プロトコルもサポートします。


残りの方法は、オーディオミキシングに固有です。

oss_mixer_device.controls()

このメソッドは、使用可能なミキサーコントロールを指定するビットマスクを返します(「コントロール」は、SOUND_MIXER_PCMSOUND_MIXER_SYNTHなどの特定の混合可能な「チャネル」です)。 このビットマスクは、使用可能なすべてのミキサーコントロールのサブセット(モジュールレベルで定義されたSOUND_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 Ultrasoundには、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)に設定します。 leftrightは、intで、0(サイレント)から100(フルボリューム)の間でなければなりません。 成功すると、新しいボリュームは2タプルとして返されます。 一部のサウンドカードのミキサーの解像度には制限があるため、これは指定された音量と正確に同じではない場合があることに注意してください。

無効なミキサーコントロールが指定された場合、または指定されたボリュームが範囲外の場合、 OSSAudioError が発生します。

oss_mixer_device.get_recsrc()
このメソッドは、現在録音ソースとして使用されているコントロールを示すビットマスクを返します。
oss_mixer_device.set_recsrc(bitmask)

この関数を呼び出して、録音ソースを指定します。 成功した場合、新しい記録ソースを示すビットマスクを返します。 無効なソースが指定された場合、 OSError が発生します。 現在の録音ソースをマイク入力に設定するには:

mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)