Объект Android AudioTrack не воспроизводит тихий синусоидальный сигнал (ниже примерно 15 дБ) - PullRequest
3 голосов
/ 07 декабря 2011

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

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

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

1 Ответ

0 голосов
/ 27 ноября 2013

У меня похожая проблема.В моем приложении я должен играть тихо в начале (амплитуда синусоидальной волны равна 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.  

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

...