このインターフェイスは、実際のハードウェアにおけるI/Oデバイスについての情報を取得するためのインターフェイスである。
コールバック名 | 概要 |
slAvailableAudioInputsChangedCallback |
種別 | インターフェイス関数名 | 概要 |
slAvailableAudioOutputsChangedCallback | ||
slDefaultDeviceIDMapChangedCallback | ||
入力 | QueryAudioInputCapabilities | |
GetAvailableAudioInputs | ||
RegisterAvailableAudioInputsChangedCallback | ||
GetAssociatedAudioInputs | ||
出力 | QueryAudioOutputCapabilities | |
GetAvailableAudioOutputs | ||
RegisterAvailableAudioOutputsChangedCallback | ||
GetAssociatedAudioOutputs | ||
RegisterDefaultDeviceIDMapChangedCallback | ||
GetDefaultAudioDevices | ||
QuerySampleFormatsSupported | デバイスが対応しているサンプリング周波数を取得する。 |
OpenSLESでは、まずは最初にエンジン(engineObject)を作成するところから始めるが、それにはまず、slCreateEngine関数を利用する。この関数ではengineObjectを生成するために、2つの設定できる項目がある。1つはEngineOptionで主に、スレッドセーフのオプションを指定し、もうひとつは利用するインターフェイスを設定する。といっても、OpenSLESの実装やハードウェアスペックなどによって、インターフェイス(各OpenSLの個別機能)は違っているため、通常はslQueryNumSupportedEngineInterfaces関数を利用して、対応しているインターフェイスを確認した上で設定を行う。ただし実際この engineObjectで利用できるインターフェイスは下記の実質4つ。よって設定では設定なし(null)でも大抵機能する。
オプション設定の例
SLEngineOption EngineOption[] = { SL_ENGINEOPTION_THREADSAFE, SL_BOOLEAN_TRUE, SL_ENGINEOPTION_LOSSOFCONTROL, SL_BOOLEAN_TRUE }; SLObjectItf engineObject; slCreateEngine( &engineObject, // エンジンオブジェクトを作成する場所 2, // 下のEngineOptionで指定したオプションの数 EngineOption, // 定義されたエンジンオプションの構造体 0, // 設定するインターフェイスの数 NULL, // 設定するインターフェイスIDの配列 NULL // 設定するインターフェイスIDに設定する値の配列 );
Option名 | 引数 | 説明 |
SL_ENGINEOPTION_THREADSAFE | SL_BOOLEAN_TRUE | このオプションはengineObjectを作成する際に、スレッドセーフに対応させるもので、基本的には指定したほうが良い。 |
SL_ENGINEOPTION_LOSSOFCONTROL | SL_BOOLEAN_TRUE | loss-of-control(コントロールによる損失。要は諸般の理由で音が飛んだような場合)が発生したときに、engineObjectからの通知を受け取るように設定する場合に trueを指定する。初期値は SL_BOOLEAN_FALSE |
SL_ENGINEOPTION_MAJORVERSION | <majorバージョンの数字> | engineObjectに必要なメジャーバージョンの指定。通常特に指定の必要なし |
SL_ENGINEOPTION_MINORVERSION | <minorバージョンの数字> | engineObjectに必要なマイナーバージョンの指定。通常特に指定の必要なし |
SL_ENGINEOPTION_STEPVERSION | <stepバージョンの数字> | engineObjectに必要なステップバージョンの指定。通常特に指定の必要なし |
上記で説明のあった engineObject作成時のインターフェイスの取得例
SLuint32 num = 0; slQueryNumSupportedEngineInterfaces(&num); // サポートされているインターフェイスの数を取得 for (i=0 ; i<num ; ++i){ SLInterfaceID id; slQuerySupportedEngineInterfaces( i, &interface_id ); // サポートしているインターフェイス情報を取得 if ( id == SL_IID_OBJECT ) LOGD ("supported SL_IID_OBJECT"); // 表示 }
engineObjectに指定する場合は、上記の方法でインターフェイスIDを取得し、必要分配列を作ってslCreateEngineに渡す。
SLInterfaceID *engine_ids = calloc(num+1, sizeof(SLInterfaceID)); SLboolean *engine_req = calloc(num+1, sizeof(SLboolean)); for (i=0 ; i<num ; ++i){ slQuerySupportedEngineInterfaces(i, &interfaceID); engine_ids[i] = interfaceID; engine_req[i] = SL_BOOLEAN_TRUE; } SLObjectItf engineObject; slCreateEngine( &engineObject, // エンジンオブジェクトを作成する場所 2, // 下のEngineOptionで指定したオプションの数 EngineOption, // 定義されたエンジンオプションの構造体 num, // 設定するインターフェイスの数 engine_ids, // 設定するインターフェイスIDの配列 engine_req // 設定するインターフェイスIDに設定する値の配列 );
<engineObjectで作成できるインターフェイス>
インターフェイス名 | 個数 |
SL_IID_OBJECT | 1 |
SL_IID_DYNAMICINTERFACEMANAGEMENT | 1 |
SL_IID_ENGINE | 2 |
SL_IID_ANDROIDEFFECTCAPABILITIES | 2 |
realizeコマンドはすべてのオブジェクトを起動させるのに必要な関数でengineObjectでは以下のように利用する。
(*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
第二引数の booleanは、非同期で動作させる場合にSL_BOOLEAN_TRUEを利用する。通常はSL_BOOLEAN_FALSEで利用するほうが安全。
上記のengineObjectを作成し起動させると、engineインターフェイスを取得できるようになる。
(*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineItf);
SLEngineCapabilitiesItf engineCapItf; SLuint16 profilesSupported; (*engineObject)->GetInterface( engineObject, SL_IID_ENGINECAPABILITIES, &engineCapItf ); (*engineCapItf)->QuerySupportedProfiles( engineCapItf, &profilesSupported ); if ( profilesSupported & SL_PROFILES_PHONE ) LOGD ("SL_PROFILES_PHONE"); if ( profilesSupported & SL_PROFILES_MUSIC ) LOGD ("SL_PROFILES_MUSIC"); if ( profilesSupported & SL_PROFILES_GAME ) LOGD ("SL_PROFILES_GAME");
上記方法でエンジンが対応しているプロファイルを確認できるが、そもそもこのSL_IID_ENGINECAPABILITIESインターフェイスに対応していない実装が多いので本当に役に立たない。ちなみに、このSL_IID_ENGINECAPABILITIESで取得できる情報は次の通り。
インターフェイス関数名 | 概要 |
QuerySupportedProfiles | サポートしているプロファイルの種類(最大3つ)を取得する。 |
QueryAvailableVoices | 最大同時発音数を取得する。またハードウェア上の最大同時発音数を超えたときに、ソフトでエミュレーションする機能の実装もチェックできる |
QueryNumberOfMIDISynthesizers | MIDI機能におけるシンセサイザーの数の取得。最低1個はサ仕様で保証されている |
QueryAPIVersion | これらのQueryAPIの必要バージョンを取得できる |
QueryLEDCapabilities | LED機能?のサポート状況の取得 |
QueryVibraCapabilities | バイブレーション機能?のサポート状況の取得 |
IsThreadSafe | スレッドセーフモードに対応しているか |
※3Dサウンドや3D-MIDIは、game profile専用の機能
各オブジェクト作成関数名 | 概要 |
CreateLEDDevice | LEDオブジェクトを作成する関数。普段利用しないので説明は省略 |
CreateVibraDevice | バイブレーションオブジェクトを作成する関数。普段利用しないので説明は省略 |
CreateAudioPlayer | いわゆる一番中心となる音を再生する機能。 |
CreateAudioRecorder | マイクなどから音を録音するための機能。普段利用しないので説明は省略 |
CreateMidiPlayer | MIDIを再生するための機能 |
CreateListener | 3Dサウンド時の聞き手の位置などを管理するためのリスナーオブジェクトを作成する関数 |
Create3DGroup | 3Dサウンド時に各音源をグループ化するための3Dグループオブジェクトを作成する関数 |
CreateOutputMix | ミキサーオブジェクトを作成する関数 |
CreateMetadataExtractor | メタデータ展開オブジェクトを作成する関数。良く分からない。普段利用しないので説明は省略 |
CreateExtensionObject | 拡張オブジェクトを作成する関数。普段利用しないので説明は省略 |
QueryNumSupportedInterfaces | engineオブジェクトで対応しているインターフェイスの数を取得。詳細は上記項目を参照 |
QuerySupportedInterfaces | engineオブジェクトで対応している個別インターフェイスのIDを取得。詳細は上記項目を参照 |
QueryNumSupportedExtensions | engineオブジェクトで対応している拡張インターフェイスの数を取得。詳細は上記項目を参照 |
QuerySupportedExtension | engineオブジェクトで対応している個別拡張インターフェイスのIDを取得。詳細は上記項目を参照 |
IsExtensionSupported | engineが拡張インターフェイスに対応しているかのフラグ取得 |
OutputMixオブジェクトは、最後の発音の段階でのミキシングを行う、いわゆるミキサー(スピーカー手前の装置)のような機能を行うが、このオブジェクトでは以下のようなインターフェイスが提供されている。
インターフェイス名 | Emu対応 | 概要 |
SL_IID_OBJECT | ○ | |
SL_IID_DYNAMICINTERFACEMANAGEMENT | ○ | |
SL_IID_OUTPUTMIX | ○ | |
SL_IID_ENVIRONMENTALREVERB | ○ | |
SL_IID_EQUALIZER | ○ | |
SL_IID_PRESETREVERB | ○ | |
SL_IID_VIRTUALIZER | ○ | |
SL_IID_BASSBOOST | ○ | |
SL_IID_ANDROIDEFFECT | ○ | |
SL_IID_VOLUME | × | |
SL_IID_VISUALIZATION | × |
engineインターフェイスから、CreateAudioPlayer関数を通じて作成されるAudioPlayerオブジェクトは、音源を再生するための各種インファーフェイスを提供する。
インターフェイス名 | 概要 |
SL_IID_ANDROIDSIMPLEBUFFERQUEUE | Android専用のバッファーキューを利用する場合のインターフェイス |
SL_IID_EFFECTSEND | リバーブ効果などの効果を設定できるようにするインターフェイス |
SL_IID_VOLUME | 音量を設定できるようにするインターフェイス |
SL_IID_OBJECT | |
SL_IID_DYNAMICINTERFACEMANAGEMENT | |
SL_IID_PLAY | |
SL_IID_BUFFERQUEUE | 通常Androidでは、SL_IID_ANDROIDSIMPLEBUFFERQUEUEを利用 |
SL_IID_EFFECTSEND | |
SL_IID_MUTESOLO | |
SL_IID_METADATAEXTRACTION | |
SL_IID_PREFETCHSTATUS | |
SL_IID_SEEK | |
SL_IID_BASSBOOST | |
SL_IID_ENVIRONMENTALREVERB | |
SL_IID_EQUALIZER | |
SL_IID_PRESETREVERB | |
SL_IID_PLAYBACKRATE | |
SL_IID_VIRTUALIZER | |
SL_IID_ANDROIDEFFECT | |
SL_IID_ANDROIDEFFECTSEND | |
SL_IID_ANDROIDCONFIGURATION |
リスナーオブジェクトは、3Dサウンドを実現する上で、聞き手の位置を管理するオブジェクトとなる。
ボリュームインターフェイスは、AudioPlayerオブジェクト(SL_OBJECTID_AUDIOPLAYER)、MIDIPlayerオブジェクト(SL_OBJECTID_MIDIPLAYER)、OutputMixオブジェクト(SL_OBJECTID_OUTPUTMIX)の3つのオブジェクトに提供されているインターフェイスであり、モノラルサウンドには、パン・エフェクトで、ステレオサウンドには、ポジション・エフェクトの形で提供します。(利用関数はモノもステレオも同じ)
全部で9個の関数が提供されている。
種別 | 関数名 | 概要 |
音量 | SetVolumeLevel | 対象オブジェクトの音量を設定します |
GetVolumeLevel | 対象オブジェクトの音量を取得します | |
GetMaxVolumeLevel | SetVolumeLevelで設定できる最大音量を取得します。最小値は基本的にSL_MILLIBEL_MINという定数で定義されていますが、どうやら実装で違うようです | |
SetMute | 対象オブジェクトの音量をミュート(消音)また、アンミュート(発音)します。(トグル) | |
GetMute | 対象オブジェクトの音量をミュート状態(トグル状態)を取得します。SL_BOOLEANで返ります | |
位置 | EnableStereoPosition | 音源オブジェクトの左右ポジション効果(Effect)の機能の有効・無効を切り替えます |
IsEnabledStereoPosition | 音源オブジェクトの左右ポジション効果の有効・無効の状態を取得します | |
SetStereoPosition | 音源オブジェクトの左右ポジションを指定します | |
GetStereoPosition | 音源オブジェクトの左右ポジションを取得します |
SLPlayItfインターフェイスは、AudioPlayerオブジェクト(SL_OBJECTID_AUDIOPLAYER)と、MIDIPlayerオブジェクト(SL_OBJECTID_MIDIPLAYER)に提供されているインターフェイスで、主に再生状況(status)の変更や取得に用いられる。
関数名 | 概要 |
slPlayCallback | コールバックが発生した場合の挙動を設定 |
SetPlayState | 各Playerオブジェクトのstatusの変更。SL_PLAYSTATE_STOPPED、SL_PLAYSTATE_PLAYING、SL_PLAYSTATE_PAUSEDの3つの状態がある。 |
GetPlayState | 各Playerオブジェクトのstatusの取得 |
GetDuration | 各Playerオブジェクトの生存時間を、ミリ秒で取得 |
GetPosition | 各Playerオブジェクトの再生位置を取得 |
RegisterCallback | コールバックが発生した場合の呼び出し関数を設定 |
SetCallbackEventsMask | コールバックの挙動にマスク処理(一時的にコールバックしないなど)を設定する |
GetCallbackEventsMask | コールバックの挙動のマスク処理の状態を取得 |
SetMarkerPosition | 指定したポジションでコールバックするように設定 |
ClearMarkerPosition | 上記のポジションコールバックをクリア |
GetMarkerPosition | 上記のコールバックのポジションを取得 |
SetPositionUpdatePeriod | |
GetPositionUpdatePeriod |
SLOutputMixItfインターフェイスは、OutputMixオブジェクトにのみ実装されるインターフェイスであり、OutputMixオブジェクトと、出力デバイスとの接続の指定を行う関数を持つ。
全部で3つの関数とコールバック構造体がある。
関数名 | 概要 |
GetDestinationOutputDeviceIDs | 現在OutputMixオブジェクトに関連付けられているデバイスIDを取得 |
RegisterDeviceChangeCallback | デバイスとの関連付けが変更された場合に呼び出されるコールバックを登録する |
ReRoute | OutputMixオブジェクトに指定デバイスIDを関連付ける |
コールバック構造体 | 概要 |
slMixDeviceChangeCallback |
|slMixDeviceChangeCallback
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.collavier.android.libtremor.nativeoggplayer" > <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> </manifest>