Loading include/media/AudioIoDescriptor.h +2 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ public: AudioIoDescriptor() : mIoHandle(AUDIO_IO_HANDLE_NONE), mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), mChannelMask(AUDIO_CHANNEL_NONE), mFrameCount(0), mLatency(0) mFrameCount(0), mFrameCountHAL(0), mLatency(0) { memset(&mPatch, 0, sizeof(struct audio_patch)); } Loading @@ -62,6 +62,7 @@ public: audio_format_t mFormat; audio_channel_mask_t mChannelMask; size_t mFrameCount; size_t mFrameCountHAL; uint32_t mLatency; // only valid for output }; Loading include/media/AudioSystem.h +10 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ class AudioSystem { public: // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp /* These are static methods to control the system-wide AudioFlinger * only privileged processes can have access to them */ Loading Loading @@ -117,8 +119,8 @@ public: // returns the audio HAL sample rate static status_t getSamplingRate(audio_io_handle_t ioHandle, uint32_t* samplingRate); // returns the number of frames per audio HAL buffer. Corresponds to // audio_stream->get_buffer_size()/audio_stream_out/in_frame_size() // For output threads with a fast mixer, returns the number of frames per normal mixer buffer. // For output threads without a fast mixer, or for input, this is same as getFrameCountHAL(). static status_t getFrameCount(audio_io_handle_t ioHandle, size_t* frameCount); // returns the audio output latency in ms. Corresponds to Loading Loading @@ -166,6 +168,12 @@ public: // Indicate JAVA services are ready (scheduling, power management ...) static status_t systemReady(); // Returns the number of frames per audio HAL buffer. // Corresponds to audio_stream->get_buffer_size()/audio_stream_in_frame_size() for input. // See also getFrameCount(). static status_t getFrameCountHAL(audio_io_handle_t ioHandle, size_t* frameCount); // Events used to synchronize actions between audio sessions. // For instance SYNC_EVENT_PRESENTATION_COMPLETE can be used to delay recording start until // playback is complete on another audio session. Loading include/media/IAudioFlinger.h +6 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,9 @@ public: * and therefore can be cached. */ virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const = 0; // reserved; formerly channelCount() virtual audio_format_t format(audio_io_handle_t output) const = 0; virtual size_t frameCount(audio_io_handle_t ioHandle) const = 0; Loading Loading @@ -247,6 +250,9 @@ public: /* Indicate JAVA services are ready (scheduling, power management ...) */ virtual status_t systemReady() = 0; // Returns the number of frames per audio HAL buffer. virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const = 0; }; Loading media/libmedia/AudioSystem.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -104,6 +104,8 @@ sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle) return DEAD_OBJECT; } // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp status_t AudioSystem::muteMicrophone(bool state) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); Loading Loading @@ -429,6 +431,27 @@ status_t AudioSystem::systemReady() return af->systemReady(); } status_t AudioSystem::getFrameCountHAL(audio_io_handle_t ioHandle, size_t* frameCount) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == 0) return PERMISSION_DENIED; sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle); if (desc == 0) { *frameCount = af->frameCountHAL(ioHandle); } else { *frameCount = desc->mFrameCountHAL; } if (*frameCount == 0) { ALOGE("AudioSystem::getFrameCountHAL failed for ioHandle %d", ioHandle); return BAD_VALUE; } ALOGV("getFrameCountHAL() ioHandle %d, frameCount %zu", ioHandle, *frameCount); return NO_ERROR; } // --------------------------------------------------------------------------- Loading Loading @@ -528,10 +551,10 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event even } } ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x " "channel mask %#x frameCount %zu deviceId %d", "channel mask %#x frameCount %zu frameCountHAL %zu deviceId %d", event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input", ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->getDeviceId()); ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->mFrameCountHAL, ioDesc->getDeviceId()); } break; } Loading media/libmedia/IAudioFlinger.cpp +24 −1 Original line number Diff line number Diff line Loading @@ -81,7 +81,8 @@ enum { LIST_AUDIO_PATCHES, SET_AUDIO_PORT_CONFIG, GET_AUDIO_HW_SYNC, SYSTEM_READY SYSTEM_READY, FRAME_COUNT_HAL, }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -274,6 +275,8 @@ public: return reply.readInt32(); } // RESERVED for channelCount() virtual audio_format_t format(audio_io_handle_t output) const { Parcel data, reply; Loading Loading @@ -911,6 +914,18 @@ public: data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); } virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); data.writeInt32((int32_t) ioHandle); status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); if (status != NO_ERROR) { return 0; } return reply.readInt64(); } }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); Loading Loading @@ -993,6 +1008,9 @@ status_t BnAudioFlinger::onTransact( reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); return NO_ERROR; } break; // RESERVED for channelCount() case FORMAT: { CHECK_INTERFACE(IAudioFlinger, data, reply); reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); Loading Loading @@ -1419,6 +1437,11 @@ status_t BnAudioFlinger::onTransact( systemReady(); return NO_ERROR; } break; case FRAME_COUNT_HAL: { CHECK_INTERFACE(IAudioFlinger, data, reply); reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } Loading Loading
include/media/AudioIoDescriptor.h +2 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ public: AudioIoDescriptor() : mIoHandle(AUDIO_IO_HANDLE_NONE), mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), mChannelMask(AUDIO_CHANNEL_NONE), mFrameCount(0), mLatency(0) mFrameCount(0), mFrameCountHAL(0), mLatency(0) { memset(&mPatch, 0, sizeof(struct audio_patch)); } Loading @@ -62,6 +62,7 @@ public: audio_format_t mFormat; audio_channel_mask_t mChannelMask; size_t mFrameCount; size_t mFrameCountHAL; uint32_t mLatency; // only valid for output }; Loading
include/media/AudioSystem.h +10 −2 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ class AudioSystem { public: // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp /* These are static methods to control the system-wide AudioFlinger * only privileged processes can have access to them */ Loading Loading @@ -117,8 +119,8 @@ public: // returns the audio HAL sample rate static status_t getSamplingRate(audio_io_handle_t ioHandle, uint32_t* samplingRate); // returns the number of frames per audio HAL buffer. Corresponds to // audio_stream->get_buffer_size()/audio_stream_out/in_frame_size() // For output threads with a fast mixer, returns the number of frames per normal mixer buffer. // For output threads without a fast mixer, or for input, this is same as getFrameCountHAL(). static status_t getFrameCount(audio_io_handle_t ioHandle, size_t* frameCount); // returns the audio output latency in ms. Corresponds to Loading Loading @@ -166,6 +168,12 @@ public: // Indicate JAVA services are ready (scheduling, power management ...) static status_t systemReady(); // Returns the number of frames per audio HAL buffer. // Corresponds to audio_stream->get_buffer_size()/audio_stream_in_frame_size() for input. // See also getFrameCount(). static status_t getFrameCountHAL(audio_io_handle_t ioHandle, size_t* frameCount); // Events used to synchronize actions between audio sessions. // For instance SYNC_EVENT_PRESENTATION_COMPLETE can be used to delay recording start until // playback is complete on another audio session. Loading
include/media/IAudioFlinger.h +6 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,9 @@ public: * and therefore can be cached. */ virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const = 0; // reserved; formerly channelCount() virtual audio_format_t format(audio_io_handle_t output) const = 0; virtual size_t frameCount(audio_io_handle_t ioHandle) const = 0; Loading Loading @@ -247,6 +250,9 @@ public: /* Indicate JAVA services are ready (scheduling, power management ...) */ virtual status_t systemReady() = 0; // Returns the number of frames per audio HAL buffer. virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const = 0; }; Loading
media/libmedia/AudioSystem.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -104,6 +104,8 @@ sp<AudioIoDescriptor> AudioSystem::getIoDescriptor(audio_io_handle_t ioHandle) return DEAD_OBJECT; } // FIXME Declare in binder opcode order, similarly to IAudioFlinger.h and IAudioFlinger.cpp status_t AudioSystem::muteMicrophone(bool state) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); Loading Loading @@ -429,6 +431,27 @@ status_t AudioSystem::systemReady() return af->systemReady(); } status_t AudioSystem::getFrameCountHAL(audio_io_handle_t ioHandle, size_t* frameCount) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == 0) return PERMISSION_DENIED; sp<AudioIoDescriptor> desc = getIoDescriptor(ioHandle); if (desc == 0) { *frameCount = af->frameCountHAL(ioHandle); } else { *frameCount = desc->mFrameCountHAL; } if (*frameCount == 0) { ALOGE("AudioSystem::getFrameCountHAL failed for ioHandle %d", ioHandle); return BAD_VALUE; } ALOGV("getFrameCountHAL() ioHandle %d, frameCount %zu", ioHandle, *frameCount); return NO_ERROR; } // --------------------------------------------------------------------------- Loading Loading @@ -528,10 +551,10 @@ void AudioSystem::AudioFlingerClient::ioConfigChanged(audio_io_config_event even } } ALOGV("ioConfigChanged() new config for %s %d samplingRate %u, format %#x " "channel mask %#x frameCount %zu deviceId %d", "channel mask %#x frameCount %zu frameCountHAL %zu deviceId %d", event == AUDIO_OUTPUT_CONFIG_CHANGED ? "output" : "input", ioDesc->mIoHandle, ioDesc->mSamplingRate, ioDesc->mFormat, ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->getDeviceId()); ioDesc->mChannelMask, ioDesc->mFrameCount, ioDesc->mFrameCountHAL, ioDesc->getDeviceId()); } break; } Loading
media/libmedia/IAudioFlinger.cpp +24 −1 Original line number Diff line number Diff line Loading @@ -81,7 +81,8 @@ enum { LIST_AUDIO_PATCHES, SET_AUDIO_PORT_CONFIG, GET_AUDIO_HW_SYNC, SYSTEM_READY SYSTEM_READY, FRAME_COUNT_HAL, }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -274,6 +275,8 @@ public: return reply.readInt32(); } // RESERVED for channelCount() virtual audio_format_t format(audio_io_handle_t output) const { Parcel data, reply; Loading Loading @@ -911,6 +914,18 @@ public: data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); } virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); data.writeInt32((int32_t) ioHandle); status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); if (status != NO_ERROR) { return 0; } return reply.readInt64(); } }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); Loading Loading @@ -993,6 +1008,9 @@ status_t BnAudioFlinger::onTransact( reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); return NO_ERROR; } break; // RESERVED for channelCount() case FORMAT: { CHECK_INTERFACE(IAudioFlinger, data, reply); reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); Loading Loading @@ -1419,6 +1437,11 @@ status_t BnAudioFlinger::onTransact( systemReady(); return NO_ERROR; } break; case FRAME_COUNT_HAL: { CHECK_INTERFACE(IAudioFlinger, data, reply); reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } Loading