6.22.2012

ADBで端末のGPUの判別を行う

adbから端末のGPUの判別を行い各GPUに対応した圧縮テクスチャを転送などの固有処理を行うのに使用する。

adb shell cat /system/lib/egl/egl.cfg

これだけで値を取得することが出来る。ちなみに私の端末の場合は、

0 0 android
0 1 adreno200

と返ってくる。

6.18.2012

OpenAL その1 alSourceUnqueueBuffersが失敗する

OpenALにて、ストリーミング再生をするときに、アンキューを行うが、特定の条件の時に失敗する。
bufferネームとsourceネームをそれぞれ[buffer]と[source]としたとき

{
 ALint processed_buffer_num[1];
 alGetSourcei(source, AL_BUFFERS_PROCESSED, processed_buffer_num);
 if (processed_buffer_num[0] > 0)
 {
  ALenum type[1];
 alGetSourcei(source, AL_SOURCE_TYPE, type);
  alGetError();
  alSourceUnqueueBuffers(source, 1, buffer);
  ALenum error = alGetError();
 }
}
この状態でerrorが受け取った値がAL_INVALID_OPERATIONだった。つまりコンテキストがおかしいということらしい。
もちろんtype[0]の値は、AL_STREAMINGになるように設定している。
調べてみるとAL_LOOPINGをTRUEにしているとこの症状になるようだということが分かった。
なので、
{
 ALint processed_buffer_num[1];
 alGetSourcei(source, AL_BUFFERS_PROCESSED, processed_buffer_num);
 if (processed_buffer_num[0] > 0)
 {
  ALint loop = AL_FALSE;
  alGetSourcei(source, AL_LOOPING, &loop);
  alSourcei(source, AL_LOOPING, FALSE);
  alSourceUnqueueBuffers(source, 1, buffer);
  alSourcei(m_sources[0], AL_LOOPING, loop);
 }
}
とすることでアンキューできるようになった。しかしあまりスマートな感じがしない・・・