3

我在使用 Android API AudioTrack 对象播放生成的正弦音频信号时遇到问题。一切正常,而正弦信号的幅度高于 40 左右(由于 16 位 PCM 格式,最大可能的幅度值为 36535),但是当我将幅度设置为低于 40 时,除非我改变音量级别,否则不会播放任何声音侧面上下按钮(无论我是向上还是向下改变它都没有关系)。

即使这样,声音也只出现一秒钟,然后又消失,应该持续 10 秒钟。我在 SGS 2 上遇到了这个问题。我怀疑这个问题是由于操作系统核心的一些限制,也许它认为这种低信号像噪声。

如果有人知道问题可能是什么并给我一些解决方法的指导,我将不胜感激。

4

1 回答 1

0

我有一个类似的问题。在我的应用程序中,我必须在开始时播放静音(正弦波幅度为 0),然后在 2 秒后播放幅度 = 10000 的正弦波。

然而有时,即使我开始播放 AudioTrack(静态模式,流是 MUSIC),我什么也听不到,只有在我手动改变音量后,我才开始听到我的声音。在播放任何声音(甚至是静音)之前,我以编程方式将流音量设置为最大,并通过信号幅度控制输出音量。

你弄清楚这其中的原因了吗?

更新:

更深入地研究问题我发现了奇怪的事情,当设备处于这种奇怪的状态时,我对 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.  

在第二种情况下,我看到硬件如何将音量设置为最大,然后退出待机状态,但在第一种情况下不会发生。但为什么?相同的代码,唯一的区别是在第二种情况下按下音量按钮后执行它。

于 2013-11-27T09:19:02.007 回答