Я пытаюсь использовать Android AudioTrack в статическом режиме.
Я вызвал конструктор, и все идет нормально.
Когда я вызываю play (), я получаю следующее исключение...
java.lang.IllegalStateException: play () вызывается при неинициализированном AudioTrack.
Согласно отладчику, состояние AudioTrack непосредственно перед вызовом play являетсяAudioTrack.STATE_NO_STATIC_DATA.Это странно, как я только что назвал метод записи, для предоставления статических данных.
Я предоставляю размер буфера 8192, который является степенью 2. Если я предоставляю размер аудио выборок в качестве размера буфера, он выдает исключение, говорящее, что это неверный размер буфера.
Я попытался вызвать write () перед play (), что, как я и ожидал, не имело никакого значения.Я даже удалил этот вызов write, исключение, генерируемое при вызове play (), безразлично к вызову write ().
Предоставляемый мной аудиосэмпл имеет следующий формат в соответствии с sox ..
Channels : 1
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:00.25 = 11153 samples = 18.9677 CDDA sectors
File Size : 22.4k
Bit Rate : 707k
Sample Encoding: 16-bit Signed Integer PCM
Судя по всем примерам, которые я смог найти, мне кажется, что я все делаю правильно.Я попытался запустить этот код на эмуляторе и реальном устройстве.
try {
WavFile wave = new WavFile(assets.open("sine.wav"));
if (wave.getChannel() != 1)
throw new RuntimeException("Incorrect Channels");
float[] data = wave.getData();
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, wave.getSmpRate(),
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
8192,
AudioTrack.MODE_STATIC);
audioTrack.write(data , 0 , data.length , AudioTrack.WRITE_BLOCKING);
audioTrack.play();
}
catch (IOException e) {
Log.e(e.toString());
}
Прямо перед функцией воспроизведения, вот то, в каком состоянии AudioTrack находится от отладчика ....
mAppOps = {IAppOpsService$Stub$Proxy@4205}
mAttributes = {AudioAttributes@4206} "AudioAttributes: usage=1 content=2 flags=0x0 tags="
mAudioFormat = 2
mAvSyncBytesRemaining = 0
mAvSyncHeader = null
mChannelConfiguration = 12
mChannelCount = 2
mChannelIndexMask = 0
mChannelMask = 12
mDataLoadMode = 0
mEventHandlerDelegate = null
mInitializationLooper = {Looper@4207} "Looper (main, tid 1) {db61b45}"
mJniData = -1292582400
mNativeBufferSizeInBytes = 8192
mNativeBufferSizeInFrames = 2048
mNativeTrackInJavaObj = -1274526976
mPlayState = 1
mPlayStateLock = {Object@4208}
mPreferredDevice = null
mRoutingChangeListeners = {ArrayMap@4209} ArrayMap@4209, size = 0
mSampleRate = 48000
mSessionId = 21
mState = 2
mStreamType = 3
shadow$_klass_ = {Class@2915} "class android.media.AudioTrack"
shadow$_monitor_ = -2144204448
Переменная mState соответствует AudioTrack.STATE_NO_STATIC_DATA.Это странно, так как в предыдущей строке я только что написал статические данные!