トップページ > 記事閲覧
Android版イコライザー機能について
名前:ぶうわ 日時: 2018/07/08 09:11

Androidで特定の周波数のみ強調させたいです。 また、端末内蔵のシステムイコライザーのON/OFFも変えなければ 音がおかしくなると思うのですが、実装可能でしょうか?
メンテ

Page: 1 |

Re: Android版イコライザー機能について ( No.1 )
名前:管理人 日時:2018/07/08 23:30

少し調べたところ、Android版DXライブラリで使用しているサウンドAPIの OpenSL ES のイコライザー機能が使用できそうです OpenSL ES の イコライザー機能のAPI には以下のものが存在するのですが ( API の注釈はこちらのページ https://developer.android.com/reference/android/media/audiofx/Equalizer を Google翻訳にかけたものです ) // 与えられた周波数に最も影響を与えるバンドを取得します。 unsigned int GetBand( unsigned int frequency, unsigned short *pBand ); // 指定された周波数帯域の周波数範囲を取得します。 unsigned int GetBandFreqRange( unsigned short band, unsigned int *pMin, unsigned int *pMax ); // 指定されたイコライザー・バンドのゲイン・セットを取得します。 unsigned int GetBandLevel( unsigned short band, short *pLevel ); // SetBandLevel によって使用されるレベル範囲を取得します レベルはミリベールで表されます。 unsigned int GetBandLevelRange( short *pMin, short *pMax ); // 指定されたバンドの中心周波数を取得します。 unsigned int GetCenterFreq( unsigned short band, unsigned int *pCenter ); // 現在のプリセットを取得します。 unsigned int GetCurrentPreset( unsigned short *pPreset ); // Equalizerエンジンでサポートされている周波数帯域の数を取得します。 unsigned int GetNumberOfBands( unsigned short *pAmount ); // イコライザがサポートするプリセットの合計数を取得します。 unsigned int GetNumberOfPresets( unsigned short *pNumPresets ); // インデックスに基づいてプリセット名を取得します。 unsigned int GetPresetName( unsigned short index, const char ** ppName ); // 与えられたイコライザーの帯域を与えられたゲイン値に設定します。 unsigned int SetBandLevel( unsigned short band, short level ); // 指定したプリセットに従ってイコライザーを設定します。 unsigned int UsePreset( unsigned short index ); ↑こちらの内のどちらを使用できるようにすれば良いでしょうか? > また、端末内蔵のシステムイコライザーのON/OFFも変えなければ > 音がおかしくなると思うのですが、実装可能でしょうか? 何か方法があるかもしれませんが、それは恐らく無理だと思います ただのアプリがシステムの設定を変更することはできないと思いますので・・・・ ( ユーザーが音量0にしているのに、音が鳴るようにシステムの音量設定を変更するようなことができないのと同じで・・・ )
メンテ
Re: Android版イコライザー機能について ( No.2 )
名前:ぶうわ 日時:2018/07/09 10:56

回答ありがとうございます。 // 与えられた周波数に最も影響を与えるバンドを取得します。 unsigned int GetBand( unsigned int frequency, unsigned short *pBand ); // 指定された周波数帯域の周波数範囲を取得します。 unsigned int GetBandFreqRange( unsigned short band, unsigned int *pMin, unsigned int *pMax ); // 指定されたバンドの中心周波数を取得します。 unsigned int GetCenterFreq( unsigned short band, unsigned int *pCenter ); // 現在のプリセットを取得します。 unsigned int GetCurrentPreset( unsigned short *pPreset ); // インデックスに基づいてプリセット名を取得します。 unsigned int GetPresetName( unsigned short index, const char ** ppName ); // 指定したプリセットに従ってイコライザーを設定します。 unsigned int UsePreset( unsigned short index ); // 与えられたイコライザーの帯域を与えられたゲイン値に設定します。 unsigned int SetBandLevel( unsigned short band, short level ); 以上を使用出来るようにして頂きたいですm(_ _)m 翻訳だけ見ると最低 GetBand と SetBandLevel さえ使えれば設定出来そうな気がしますが… 色々検証しなければならないようです。
メンテ
Re: Android版イコライザー機能について ( No.3 )
名前:管理人 日時:2018/07/11 01:20

ご返答ありがとうございます 遅くとも次の週末中には実装したいと思いますので、少々お待ちください m(_ _)m ( 偶にド忘れしてしまうので、もし来週になっても音沙汰が無かったら催促のお書き込みをしてください m(_ _;m )
メンテ
Re: Android版イコライザー機能について ( No.4 )
名前:管理人 日時:2018/07/16 23:40

遅くなってすみません、DXライブラリAndroid版のイコライザー機能の実装が完了しましたので よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース 以下の関数を追加しました( 結局元の OpenSL ES の関数の殆どを実装する形となりました ) // イコライザー機能を使用するかどうかを設定する( DxLib_Init 呼び出し前のみ実行可能 ) // UseFlag TRUE:使用する FALSE:使用しない int SetUseEqualizer( int UseFlag ) ; // イコライザーの与えられた周波数に最も影響を与える周波数帯域を取得します // ( 戻り値 -1:エラー 0以上:周波数帯域インデックス ) int SearchEqualizerBandIndex( int Frequency ) ; // イコライザーに指定できる周波数帯域の数を取得する int GetEqualizerBandNum( void ) ; // 与えられたイコライザーの周波数帯域を与えられたゲイン値に設定します int SetEqualizerBandLevel( int BandIndex, int Level ) ; // イコライザーの指定された周波数大域のゲイン値を取得します int GetEqualizerBandLevel( int BandIndex ) ; // イコライザーの指定された周波数帯域の周波数範囲を取得します( pMin と pMax に最小周波数と最大周波数が格納されます( 単位:ヘルツ ) ) int GetEqualizerBandFreqRange( int BandIndex, int *pMin, int *pMax ) ; // イコライザーの指定された周波数帯域の中心周波数を取得します( 戻り値 中心周波数( 単位:ヘルツ ) ) int GetEqualizerBandCenterFreq( int BandIndex ) ; // イコライザーの現在のプリセットを取得します( 戻り値 プリセット番号 ) int GetEqualizerCurrentPreset( void ) ; // イコライザーのプリセットの数を取得します( 戻り値 プリセットの数 ) int GetEqualizerPresetNum( void ) ; // イコライザーのプリセット名を取得します( 戻り値 プリセット名の文字列が格納されたメモリ領域の先頭アドレス ) const char *GetEqualizerPresetName( int PresetIndex ) ; // 指定したプリセットに従ってイコライザーを設定します int SetUseEqualizerPreset( int PresetIndex ) ; Android 8.0 の実機の他、Android 4.4 のエミュレーターでもイコライザーが 機能しましたので、恐らく多くの環境で問題なく動作すると思います よろしければお試しください m(_ _)m
メンテ
Re: Android版イコライザー機能について ( No.5 )
名前:ぶうわ 日時:2018/07/17 00:51

実装ありがとうございますm(_ _)m 色々検証して使いたいと思います。 これからもよろしくお願い致します。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存