Объект Android AudioTrack не воспроизводит тихий синусоидальный сигнал (приблизительно ниже 15 дБ)

У меня проблема с воспроизведением сгенерированного синусоидального аудиосигнала с использованием объекта Android API AudioTrack. Все работает отлично, пока амплитуда синусоидального сигнала выше 40 (максимально возможное значение амплитуды 36535 из-за 16-битного формата PCM), но когда я устанавливаю амплитуду ниже 40, звук не воспроизводится, пока я не изменю уровень громкости с помощью боковые кнопки вверх-вниз (не имеет значения, если я меняю вверх или вниз).

Даже в этом случае звук появляется только на секунду и снова исчезает, и он должен длиться 10 секунд. У меня такая проблема на SGS 2. Я подозреваю, что проблема связана с каким-то ограничением в ядре ОС и, возможно, она считает этот низкий сигнал шумом.

Буду признателен, если кто-то подскажет, в чем может быть проблема, и подскажет, как ее исправить.


person eNeLOu    schedule 07.12.2011    source источник


Ответы (1)


У меня похожая проблема. В моем приложении я должен сначала играть без звука (амплитуда синусоиды равна 0), а затем, через 2 секунды, я играю синусоиду с амплитудой = 10000.

Однако иногда, даже когда я начинаю играть в AudioTrack (статический режим, поток - МУЗЫКА), я ничего не слышу, и только после того, как я изменяю громкость вручную, я начинаю слышать свои звуки. Перед воспроизведением каких-либо звуков (даже тихих) я программно устанавливаю максимальную громкость потока и контролирую выходную громкость по амплитуде сигнала.

Вы выяснили причину этого?

Обновлять:

Углубившись в проблему, я обнаружил странную вещь: пока устройство находится в этом странном состоянии, мои вызовы AudioManager.setStreamVolume не работают. Я проверил это:

int max = mAudioManager.getStreamMaxVolume(SoundConfig.outputStreamType); // max = 15
int v = mAudioManager.getStreamVolume(SoundConfig.outputStreamType); // v = 0
mAudioManager.setStreamVolume(SoundConfig.outputStreamType, max, 0); 
v = mAudioManager.getStreamVolume(SoundConfig.outputStreamType); // v = 0

После этого я начал анализировать вывод logcat, что я обнаружил: - в странном состоянии настройка громкости и запуск воспроизведения выглядят так:

12-19 12:45:37.120: D/AudioService(192): getStreamVolume(12)  
12-19 12:45:40.970: D/AudioSystem(192): getParameters() ERROR : can't get parameters  
12-19 12:45:40.970: D/AudioService(192): getStreamVolume(12)  
12-19 12:45:45.680: D/AudioService(192): getStreamVolume(12)  
12-19 12:45:50.120: I/AudioPolicyManager(110): startOutput() output 1, stream 3, session 6  
12-19 12:45:50.120: I/AudioPolicyManager(110): getDeviceForStrategy() strategy 0, device 4  
12-19 12:45:50.120: I/AudioPolicyManager(110): getDeviceForStrategy() strategy 0, device 4  
12-19 12:45:50.120: I/AudioFlinger(110): start output streamType (0, 3) for 1  
12-19 12:45:50.120: D/AudioHardware(110): AudioStreamOutALSA::setParameters() start_output_streamtype=3  
12-19 15:25:02.521: D/AudioHardware(110): AudioHardware pcm playback is exiting standby.  

Но в обычном состоянии (после того, как я нажимал кнопки громкости вверх и вниз) это выглядит так:

12-19 15:25:02.481: D/AudioSystem(193): getParameters() ERROR : can't get parameters  
12-19 15:25:02.481: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.481: I/AudioService(193):  AudioFocus  abandonAudioFocus() from  android.media.AudioManager#413cbf68com.kinsa.manager.CAndroidManager#414087a0  
12-19 15:25:02.491: I/AudioService(193):  AudioFocus  requestAudioFocus() from android.media.AudioManager#413cbf68com.kinsa.manager.CAndroidManager#414087a0  
12-19 15:25:02.491: D/AudioSystem(193): getParameters() ERROR : can't get parameters  
12-19 15:25:02.491: D/AudioHardware(110): AudioStreamOutALSA::setParameters() music_volume_index=1  
12-19 15:25:02.491: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.491: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.491: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.491: D/AudioSystem(193): getParameters() ERROR : can't get parameters  
12-19 15:25:02.501: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.501: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.501: D/AudioService(193): getStreamVolume(12)  
12-19 15:25:02.501: D/AudioHardware(110): AudioStreamOutALSA::setParameters() music_volume_index=15  
12-19 15:25:02.521: I/AudioPolicyManager(110): startOutput() output 1, stream 3, session 3  
12-19 15:25:02.521: I/AudioPolicyManager(110): getDeviceForStrategy() strategy 0, device 4  
12-19 15:25:02.521: I/AudioPolicyManager(110): getDeviceForStrategy() strategy 0, device 4  
12-19 15:25:02.521: I/AudioFlinger(110): start output streamType (0, 3) for 1  
12-19 15:25:02.521: D/AudioHardware(110): AudioStreamOutALSA::setParameters() start_output_streamtype=3  
12-19 15:25:02.521: D/AudioHardware(110): AudioHardware pcm playback is exiting standby.  

Во втором случае я вижу, как оборудование устанавливает максимальную громкость, а затем выходит из режима ожидания, но в первом случае этого не происходит. Но почему? Тот же код, разница только в том, что он выполняется после нажатия кнопок громкости во втором случае.

person user2041064    schedule 27.11.2013
comment
Еще нет. В любом случае, я рад, что кто-то заметил ситуацию. - person eNeLOu; 07.12.2013