Android AudioTrack не будет инициализироваться - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь использовать 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.Это странно, так как в предыдущей строке я только что написал статические данные!

...