getOutput的过程
./frameworks/av/services/audioflinger/AudioPolicyService.cpp
./hardware/libhardware_legacy/audio/audio_policy_hal.cpp
./hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp
播放声音
./frameworks/base/media/java/android/media/SoundPool.java
SoundPool::play
SoundChannel::play
一.数据的写入
frameworks/av/services/audioflinger/AudioFlinger.cpp
frameworks/av/media/libnbaio/AudioStreamOutSink.cpp
1.2 耳机的输出
1.1 蓝牙耳机的输出
external/bluetooth/bluedroid/audio_a2dp_hw/audio_a2dp_hw.c
蓝牙耳机的声音播放
在frameworks/av/services/audioflinger/AudioPolicyService.cpp中
hardware/libhardware_legacy/audio/audio_policy_hal.cpp:ap_get_output(146)
hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getDeviceForStrategy(2214), STRATEGY_MEDIA
I/cong ( 1346): hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getA2dpOutput(1919),
I/cong ( 1346): hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getOutput(522), getOutput() stream 1, samplingRate 0, format 0, channelMask 3, flags 0
I/cong ( 1346): hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getOutput(614), getOutput() returns output 6
I/cong ( 1346): frameworks/av/services/audioflinger/AudioPolicyService.cpp:getOutput(228), getOutput() tid 2538
./frameworks/av/services/audioflinger/AudioPolicyService.cpp
- audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream...)
- {
- return mpAudioPolicy->get_output(mpAudioPolicy, stream, samplingRate, format, channelMask, flags);
- }
./hardware/libhardware_legacy/audio/audio_policy_hal.cpp
- static audio_io_handle_t ap_get_output(struct audio_policy *pol,
- audio_stream_type_t stream,
- uint32_t sampling_rate,
- audio_format_t format,
- audio_channel_mask_t channelMask,
- audio_output_flags_t flags)
- {
- struct legacy_audio_policy *lap = to_lap(pol);
-
- dbmsg("tid %d", gettid());
- return lap->apm->getOutput((AudioSystem::stream_type)stream,
- sampling_rate, (int) format, channelMask,
- (AudioSystem::output_flags)flags);
- }
./hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp
- audio_io_handle_t AudioPolicyManagerBase::getOutput(AudioSystem::stream_type stream,
- uint32_t samplingRate,
- uint32_t format,
- uint32_t channelMask,
- AudioSystem::output_flags flags)
- {
- audio_io_handle_t output = 0;
- uint32_t latency = 0;
- routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
- audio_devices_t device = getDeviceForStrategy(strategy, false /*fromCache*/);
- // open a direct output if required by specified parameters
- IOProfile *profile = getProfileForDirectOutput(device,
- samplingRate,
- format,
- channelMask,
- (audio_output_flags_t)flags);
- if (profile != NULL) {
-
- dbmsg("getOutput() opening direct output device %x", device);
-
- AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor(profile);
- outputDesc->mDevice = device;
- outputDesc->mSamplingRate = samplingRate;
- outputDesc->mFormat = (audio_format_t)format;
- outputDesc->mChannelMask = (audio_channel_mask_t)channelMask;
- outputDesc->mLatency = 0;
- outputDesc->mFlags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_DIRECT);;
- outputDesc->mRefCount[stream] = 0;
- outputDesc->mStopTime[stream] = 0;
- output = mpClientInterface->openOutput(profile->mModule->mHandle,
- &outputDesc->mDevice,
- &outputDesc->mSamplingRate,
- &outputDesc->mFormat,
- &outputDesc->mChannelMask,
- &outputDesc->mLatency,
- outputDesc->mFlags);
-
- // only accept an output with the requested parameters
- if (output == 0 ||
- (samplingRate != 0 && samplingRate != outputDesc->mSamplingRate) ||
- (format != 0 && format != outputDesc->mFormat) ||
- (channelMask != 0 && channelMask != outputDesc->mChannelMask)) {
- dbmsg("getOutput() failed opening direct output: output %d samplingRate %d %d,"
- "format %d %d, channelMask %04x %04x", output, samplingRate,
- outputDesc->mSamplingRate, format, outputDesc->mFormat, channelMask,
- outputDesc->mChannelMask);
- if (output != 0) {
- mpClientInterface->closeOutput(output);
- }
- delete outputDesc;
- return 0;
- }
- addOutput(output, outputDesc);
- dbmsg("getOutput() returns direct output %d", output);
- return output;
- }
-
- // ignoring channel mask due to downmix capability in mixer
-
- // open a non direct output
-
- // get which output is suitable for the specified stream. The actual routing change will happen
- // when startOutput() will be called
- SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(device, mOutputs);
- output = selectOutput(outputs, flags);
- ALOGW_IF((output ==0), "getOutput() could not find output for stream %d, samplingRate %d,"
- "format %d, channels %x, flags %x", stream, samplingRate, format, channelMask, flags);
-
- dbmsg("getOutput() returns output %d", output);
-
- return output;
- }
播放声音
./frameworks/base/media/java/android/media/SoundPool.java
SoundPool::play
SoundChannel::play
一.数据的写入
frameworks/av/services/audioflinger/AudioFlinger.cpp
- void AudioFlinger::PlaybackThread::threadLoop_write()
- {
- ssize_t framesWritten = mNormalSink->write(mMixBuffer, count);
- }
frameworks/av/media/libnbaio/AudioStreamOutSink.cpp
- ssize_t AudioStreamOutSink::write(const void *buffer, size_t count)
- {
- ssize_t ret = mStream->write(mStream, buffer, count << mBitShift);
- return ret;
- }
1.2 耳机的输出
1.1 蓝牙耳机的输出
external/bluetooth/bluedroid/audio_a2dp_hw/audio_a2dp_hw.c
- static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
- size_t bytes)
- {
- struct a2dp_stream_out *out = (struct a2dp_stream_out *)stream;
- sent = skt_write(out->audio_fd, buffer, bytes);
- return sent;
- }
- static int skt_write(int fd, const void *p, size_t len)
- {
- int sent;
- struct pollfd pfd;
- pfd.fd = fd;
- pfd.events = POLLOUT;
- if (poll(&pfd, 1, 500) == 0)
- return 0;
- sent = send(fd, p, len, MSG_NOSIGNAL);
-
- return sent;
- }
蓝牙耳机的声音播放
在frameworks/av/services/audioflinger/AudioPolicyService.cpp中
- audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,...)
- {
- if (mpAudioPolicy == NULL) {
- return 0;
- }
- Mutex::Autolock _l(mLock);
- return mpAudioPolicy->get_output(mpAudioPolicy, stream, ...);
- }
- static audio_io_handle_t ap_get_output(struct audio_policy *pol, audio_stream_type_t stream,...)
- {
- struct legacy_audio_policy *lap = to_lap(pol);
- return lap->apm->getOutput((AudioSystem::stream_type)stream,);
- }
- audio_io_handle_t AudioPolicyManagerBase::getOutput(AudioSystem::stream_type stream, )
- {
- routing_strategy strategy = getStrategy((AudioSystem::stream_type)stream);
- audio_devices_t device = getDeviceForStrategy(strategy, false );
- IOProfile *profile = getProfileForDirectOutput(device,...);
- if (profile != NULL) {
- }
- SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(device, mOutputs);
- output = selectOutput(outputs, flags);
- return output;
- }
I/cong ( 1346): hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getA2dpOutput(1919),
I/cong ( 1346): hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getOutput(522), getOutput() stream 1, samplingRate 0, format 0, channelMask 3, flags 0
I/cong ( 1346): hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp:getOutput(614), getOutput() returns output 6
I/cong ( 1346): frameworks/av/services/audioflinger/AudioPolicyService.cpp:getOutput(228), getOutput() tid 2538