特定のアプリの音量をセットできないかという話-その4

まだやってんのか、という声も聞こえてきそうですけど、まだやってんです。もうしばらく続きます。

 

Ringtoneのソース見てたら、MediaPlayerに行き着いて、結局RingtoneもMediaplayer使って再生してるのか、っていうのと、だからmp3とかも再生できるのでっていうところまでは副産物でわかってきた話です。

そんで、プログラム的(GrepCode:android.media.MediaPlayer)に見るとMediaplayerは、ファイルの読み込みを行ったあとは、

public  void start() throws IllegalStateException {
    stayAwake(true);
    _start();
}

private native void _start() throws IllegalStateException;

という感じで、ネイティブコードよびだしてるというところなんで、あんま参考になりませんでした。

読み込んでるところは↓

static {
    System.loadLibrary("media_jni");
    native_init();
}

media_jniってのを使って、ネイティブコードで処理してる。ハードウェア寄りの話だから当たり前なんですけど。

インターフェースは、IMediaplayer.cppで、ここはほんと呼び出しだけ。

ソースはmediaplayer.cppで、どういう風な構成になっているか的な話はunderstanding the android media frameworkに、図解されてます。(まだ全部読んでないけど)

status_t MediaPlayer::start()
{
    LOGV("start");
    Mutex::Autolock _l(mLock);
    if (mCurrentState & MEDIA_PLAYER_STARTED)
        return NO_ERROR;
    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |
                    MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {
        mPlayer->setLooping(mLoop);
        mPlayer->setVolume(mLeftVolume, mRightVolume);
        mCurrentState = MEDIA_PLAYER_STARTED;
        status_t ret = mPlayer->start();
        if (ret != NO_ERROR) {
            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
        } else {
            if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
                LOGV("playback completed immediately following start()");
            }
        }
        return ret;
    }
    LOGE("start called in state %d", mCurrentState);
    return INVALID_OPERATION;
}

やりたいことは、赤字にしたところのパラメータを書き換えたいだけなのにね。

mPlayerの元になるmediaplayer.hを見てみると、mPlayerの宣言は次の通り。

sp<IMediaPlayer>            mPlayer;

 

JNIとかBinderに関することをもう少し知らないと、この辺りのつながりがいまいちわかりません。

内部的なことを調べるのは、置いておこう。

 

実際にココまで書いてて脱線してるのもわかってて、ほんとに調べるべきことは音だそうとしてる人が持っているAudiorManagerのインスタンスというか、それを取得するときに使うContextのような実際に音を出すときに使っている情報を横取りできるかどうかというところなんで、他のプロセスにあるそういう情報を取ってこられるのかどうかっていう話かなあ。

そうなってくると、他のプロセスをのぞき見ることができるわけではないので、ダメなんじゃないかっていう気がしてくる。

 

ま、そんなわけで、もう少し続きます。

広告

About sato_c

小学生の頃にインベーダーゲームやPC-8001やApple][といったものを知ってしまい、それ以降ずーっとゲーム好き。でも、あんまりうまくはありません。 仕事は当初はゲーム関係のプログラムやサウンドをやっていましたが、WEB関係を通ったあと、遊技機関係のプログラムやサウンドをやっています。あまり節操がないのか。 現在はJavaですてきなコードを書けるように勉強中。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。