1,需求
用户需求:实用工具,可用于调试/测试多音频硬件设备、蓝牙无线扩音器、指定设备录音等。
系统需求:实现多个设备之间音频流的任意流动,包括麦克风(手机、蓝牙耳机、有线耳机)到扬声器(手机、蓝牙耳机、有线耳机)、麦克风到文件、文件到扬声器的音频流动。用户可任意选择输入/输出音频设备。支持单输入流多输出流。可视化声音。
2,架构设计
设计原则:
- 用户界面与功能模块解耦
- 各种类流统一接口
- 层次化
- Activity是用户界面。
- UserInteractive是UI适配层,对于功能模块来说接口不变;
- AudioRouter是流的流向管理,支持单输入流多输出流;
- FileStream是文件流,可以输出(录音文件播放)也可以输入(录音保存);
- Microphone是麦克风设备流;
- Speaker是扬声器流,用于通过Bar显示声音强度;
- SoundBar是声音强度可视化组件;
3,实现
输入设备选择
输出设备选择
音频流转发
实践发现,不同手机的音频配置不样同。而DeviceInfo输出的详细信息,有可能和打开AudioRecord或AudioTrack配置对不上,比如我手K70手机中,内置麦克风详细信息显示支持单声道,实际不支持单声道。
4,接口代码
public interface UserInteractive {
interface UserEventListener {
void onEventListener();
}
public ProgressBar[] getProgressBars();
public AudioDeviceInfo getInputDeviceInfo();
public AudioDeviceInfo getOutputDeviceInfo();
public void setStartRoutingListener(UserEventListener listener);
public void setStopRoutingListener(UserEventListener listener);
public void setViewStatus(String status);
public void OnStatusChanged(int status);
public int getAudioFormat();
public int getAudioSampling();
public int getAudioChannel();
public AudioManager getAudioManager();
}
public interface StreamRouter {
void registerInputStream(AudioStream input);
void registerOutputStream(AudioStream output);
void startStreamRouting();
void stopStreamRouting();
int getRoutingStatus();
}
public interface AudioStream {
public int init() throws Exception;
public int readData(byte[] streamData, int size);
public int writeData(byte[] streamData, int size);
public int release();
}
Mainacitivy实现UserInteractive
class MainActivity extends AppCompatActivity implements UserInteractive
麦克风、声音指示条、扬声器实现了AudioStream
class MicrophoneStream implements AudioStream
class SoundBarStream implements AudioStream
class SpeakerStream implements AudioStream
AudioRouter实现了StreamRouter
class AudioRouter implements StreamRouter