AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track // to one output stream: no software mixer AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of // the device. It is unique and must be ...
并创建对应的 MixerThread 了;而此时 DirectOutputThread 与 OffloadThread 不会被创建,直到标识为 AUDIO_OUTPUT_FLAG_DIRECT/AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD 的音频流需要输出时,才开始创建 DirectOutputThread/OffloadThread 和打开 direct_out/compress_offload 设备。
AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track // to one output stream: no software mixer AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of // the device. It is unique and must be ...
总之正常传入pcm,offload模式传入mp3或者aac文件 326 uint32_t *channels,//声道数 327 uint32_t *sampleRate,//采样率 328 status_t *status, 329 uint32_t output_flag//这个就是output类型,一般有DIRECT、fast、deep_buffer、compress_offload等
thread = new OffloadThread(this, outputStream, *output, devices, mSystemReady); ALOGV("openOutput_l() created offload output: ID %d thread %p", *output, thread.get()); } else if ((flags & AUDIO_OUTPUT_FLAG_DIRECT) || !isValidPcmSinkFormat(config->format) ...
direct { flags AUDIO_OUTPUT_FLAG_DIRECT formats AUDIO_FORMAT_PCM_16_BIT sampling_rates 48000 bit_width 16 app_type 69936 } direct_pcm_16 { flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PCM flags AUDIO_OUTPUT_FLAG_DIRECT formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_...
(): 1. 如果输出标识置了 AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD 或 AUDIO_OUTPUT_FLAG_DIRECT,那么最终调用 AudioFlinger::openOutput() 打开输出标识对应的输出流设备并创建相应的 PlaybackThread,保存该 PlaybackThread 对应的 audio_io_handle_t 给 AudioTrack; 2. 如果输出标识是其他类型,那么根据策略选择一个...
//如果标志为OUTPUT_FLAG_DIRECT,则创建DirectOutputThread thread = new DirectOutputThread(this, output, ++mNextThreadId); } else { //一般创建的都是MixerThread,注意代表AudioStreamOut对象的output也传进去了 thread= new MixerThread(this, output, ++mNextThreadId); } //把新创建的线程加入线程组mPla...
搜索发现,AudioFlinger中只有函数AudioFlinger::DirectOutputThread::threadLoop调用了, 而我们说的AudioTrack是播放音乐用的,所以,肯定不是这儿。 另外,发现AudioMixer中有几个地方调用了函数getNextBuffer,不过调用代码如下: t.bufferProvider->getNextBuffer(&t.buffer); ...
我们根据不同的播放场景,使用不同的输出标识,如按键音、游戏背景音对输出时延要求很高,那么就需要置 AUDIO_OUTPUT_FLAG_FAST,具体可以参考 ToneGenerator、SoundPool 和 OpenSL ES。 一个AudioTrack Natvie API 的测试例子(MODE_STATIC/TRANSFER_SHARED 模式),代码文件位置: ...