Edit
OpenSLESについて

Edit
SLAudioIODeviceCapabilitiesItfインターフェイスについて

このインターフェイスは、実際のハードウェアにおけるI/Oデバイスについての情報を取得するためのインターフェイスである。

Edit
コールバック

コールバック名概要
slAvailableAudioInputsChangedCallback

Edit
インターフェイス関数の一覧

種別インターフェイス関数名概要
slAvailableAudioOutputsChangedCallback
slDefaultDeviceIDMapChangedCallback
入力QueryAudioInputCapabilities
GetAvailableAudioInputs
RegisterAvailableAudioInputsChangedCallback
GetAssociatedAudioInputs
出力QueryAudioOutputCapabilities
GetAvailableAudioOutputs
RegisterAvailableAudioOutputsChangedCallback
GetAssociatedAudioOutputs
RegisterDefaultDeviceIDMapChangedCallback
GetDefaultAudioDevices
QuerySampleFormatsSupportedデバイスが対応しているサンプリング周波数を取得する。

Edit
エンジンオブジェクトについて

OpenSLESでは、まずは最初にエンジン(engineObject)を作成するところから始めるが、それにはまず、slCreateEngine関数を利用する。この関数ではengineObjectを生成するために、2つの設定できる項目がある。1つはEngineOptionで主に、スレッドセーフのオプションを指定し、もうひとつは利用するインターフェイスを設定する。といっても、OpenSLESの実装やハードウェアスペックなどによって、インターフェイス(各OpenSLの個別機能)は違っているため、通常はslQueryNumSupportedEngineInterfaces関数を利用して、対応しているインターフェイスを確認した上で設定を行う。ただし実際この engineObjectで利用できるインターフェイスは下記の実質4つ。よって設定では設定なし(null)でも大抵機能する。

Edit
EngineOption

オプション設定の例

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_THREADSAFESL_BOOLEAN_TRUEこのオプションはengineObjectを作成する際に、スレッドセーフに対応させるもので、基本的には指定したほうが良い。
SL_ENGINEOPTION_LOSSOFCONTROLSL_BOOLEAN_TRUEloss-of-control(コントロールによる損失。要は諸般の理由で音が飛んだような場合)が発生したときに、engineObjectからの通知を受け取るように設定する場合に trueを指定する。初期値は SL_BOOLEAN_FALSE
SL_ENGINEOPTION_MAJORVERSION<majorバージョンの数字>engineObjectに必要なメジャーバージョンの指定。通常特に指定の必要なし
SL_ENGINEOPTION_MINORVERSION<minorバージョンの数字>engineObjectに必要なマイナーバージョンの指定。通常特に指定の必要なし
SL_ENGINEOPTION_STEPVERSION<stepバージョンの数字>engineObjectに必要なステップバージョンの指定。通常特に指定の必要なし

Edit
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_OBJECT1
SL_IID_DYNAMICINTERFACEMANAGEMENT1
SL_IID_ENGINE2
SL_IID_ANDROIDEFFECTCAPABILITIES2

Edit
realizeについて

realizeコマンドはすべてのオブジェクトを起動させるのに必要な関数でengineObjectでは以下のように利用する。

(*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);

第二引数の booleanは、非同期で動作させる場合にSL_BOOLEAN_TRUEを利用する。通常はSL_BOOLEAN_FALSEで利用するほうが安全。

Edit
engineインターフェイスの作成

上記のengineObjectを作成し起動させると、engineインターフェイスを取得できるようになる。

Edit
engineインターフェイスの取得

(*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineItf);

Edit
engineインターフェイスでサポートしている機能の確認。

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で取得できる情報は次の通り。

Edit
engine objectで対応しているインターフェイス一覧

インターフェイス関数名概要
QuerySupportedProfilesサポートしているプロファイルの種類(最大3つ)を取得する。
QueryAvailableVoices最大同時発音数を取得する。またハードウェア上の最大同時発音数を超えたときに、ソフトでエミュレーションする機能の実装もチェックできる
QueryNumberOfMIDISynthesizersMIDI機能におけるシンセサイザーの数の取得。最低1個はサ仕様で保証されている
QueryAPIVersionこれらのQueryAPIの必要バージョンを取得できる
QueryLEDCapabilitiesLED機能?のサポート状況の取得
QueryVibraCapabilitiesバイブレーション機能?のサポート状況の取得
IsThreadSafeスレッドセーフモードに対応しているか

※3Dサウンドや3D-MIDIは、game profile専用の機能

Edit
engineインターフェイスで提供される機能

Edit
機能の一覧

各オブジェクト作成関数名概要
CreateLEDDeviceLEDオブジェクトを作成する関数。普段利用しないので説明は省略
CreateVibraDeviceバイブレーションオブジェクトを作成する関数。普段利用しないので説明は省略
CreateAudioPlayerいわゆる一番中心となる音を再生する機能。
CreateAudioRecorderマイクなどから音を録音するための機能。普段利用しないので説明は省略
CreateMidiPlayerMIDIを再生するための機能
CreateListener3Dサウンド時の聞き手の位置などを管理するためのリスナーオブジェクトを作成する関数
Create3DGroup3Dサウンド時に各音源をグループ化するための3Dグループオブジェクトを作成する関数
CreateOutputMixミキサーオブジェクトを作成する関数
CreateMetadataExtractorメタデータ展開オブジェクトを作成する関数。良く分からない。普段利用しないので説明は省略
CreateExtensionObject拡張オブジェクトを作成する関数。普段利用しないので説明は省略
QueryNumSupportedInterfacesengineオブジェクトで対応しているインターフェイスの数を取得。詳細は上記項目を参照
QuerySupportedInterfacesengineオブジェクトで対応している個別インターフェイスのIDを取得。詳細は上記項目を参照
QueryNumSupportedExtensionsengineオブジェクトで対応している拡張インターフェイスの数を取得。詳細は上記項目を参照
QuerySupportedExtensionengineオブジェクトで対応している個別拡張インターフェイスのIDを取得。詳細は上記項目を参照
IsExtensionSupportedengineが拡張インターフェイスに対応しているかのフラグ取得

Edit
OutputMixオブジェクトについて

OutputMixオブジェクトは、最後の発音の段階でのミキシングを行う、いわゆるミキサー(スピーカー手前の装置)のような機能を行うが、このオブジェクトでは以下のようなインターフェイスが提供されている。

Edit
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×

Edit
AudioPlayerオブジェクトについて(以後playerオブジェクト)

engineインターフェイスから、CreateAudioPlayer関数を通じて作成されるAudioPlayerオブジェクトは、音源を再生するための各種インファーフェイスを提供する。

Edit
AudioPlayerオブジェクトに対応しているインターフェイス一覧

インターフェイス名概要
SL_IID_ANDROIDSIMPLEBUFFERQUEUEAndroid専用のバッファーキューを利用する場合のインターフェイス
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

Edit
AudioObjectで利用できる関数

Edit
ListenerObjectについて

リスナーオブジェクトは、3Dサウンドを実現する上で、聞き手の位置を管理するオブジェクトとなる。

Edit
ListenerObjectのインターフェイス

Edit
SLVolumeItf(SL_IID_VOLUME)について

ボリュームインターフェイスは、AudioPlayerオブジェクト(SL_OBJECTID_AUDIOPLAYER)、MIDIPlayerオブジェクト(SL_OBJECTID_MIDIPLAYER)、OutputMixオブジェクト(SL_OBJECTID_OUTPUTMIX)の3つのオブジェクトに提供されているインターフェイスであり、モノラルサウンドには、パン・エフェクトで、ステレオサウンドには、ポジション・エフェクトの形で提供します。(利用関数はモノもステレオも同じ)

Edit
SLVolumeItf(SL_IID_VOLUME)で提供される関数について

全部で9個の関数が提供されている。

種別関数名概要
音量SetVolumeLevel対象オブジェクトの音量を設定します
GetVolumeLevel対象オブジェクトの音量を取得します
GetMaxVolumeLevelSetVolumeLevelで設定できる最大音量を取得します。最小値は基本的にSL_MILLIBEL_MINという定数で定義されていますが、どうやら実装で違うようです
SetMute対象オブジェクトの音量をミュート(消音)また、アンミュート(発音)します。(トグル)
GetMute対象オブジェクトの音量をミュート状態(トグル状態)を取得します。SL_BOOLEANで返ります
位置EnableStereoPosition音源オブジェクトの左右ポジション効果(Effect)の機能の有効・無効を切り替えます
IsEnabledStereoPosition音源オブジェクトの左右ポジション効果の有効・無効の状態を取得します
SetStereoPosition音源オブジェクトの左右ポジションを指定します
GetStereoPosition音源オブジェクトの左右ポジションを取得します

Edit
SLPlayItf(SL_IID_PLAY)インターフェイスについて

SLPlayItfインターフェイスは、AudioPlayerオブジェクト(SL_OBJECTID_AUDIOPLAYER)と、MIDIPlayerオブジェクト(SL_OBJECTID_MIDIPLAYER)に提供されているインターフェイスで、主に再生状況(status)の変更や取得に用いられる。

Edit
SLPlayItf(SL_IID_PLAY)インターフェイスで提供されている関数

関数名概要
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

Edit
SLOutputMixItf(SL_IID_OUTPUTMIX)インターフェイスについて

SLOutputMixItfインターフェイスは、OutputMixオブジェクトにのみ実装されるインターフェイスであり、OutputMixオブジェクトと、出力デバイスとの接続の指定を行う関数を持つ。

Edit
SLOutputMixItf(SL_IID_OUTPUTMIX)インターフェイスが提供する関数

全部で3つの関数とコールバック構造体がある。

関数名概要
GetDestinationOutputDeviceIDs現在OutputMixオブジェクトに関連付けられているデバイスIDを取得
RegisterDeviceChangeCallbackデバイスとの関連付けが変更された場合に呼び出されるコールバックを登録する
ReRouteOutputMixオブジェクトに指定デバイスIDを関連付ける
コールバック構造体概要
slMixDeviceChangeCallback

|slMixDeviceChangeCallback

Edit
TIPS

Edit
AndroidManufest.xmlに許可の追加

<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>

Edit
実装されているAPIのチェック方法

Edit
MIDI利用での注意