Loading media/libaudioclient/AudioRecord.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -89,7 +89,8 @@ AudioRecord::AudioRecord( audio_input_flags_t flags, uid_t uid, pid_t pid, const audio_attributes_t* pAttributes) const audio_attributes_t* pAttributes, audio_port_handle_t selectedDeviceId) : mActive(false), mStatus(NO_INIT), mOpPackageName(opPackageName), Loading @@ -97,12 +98,11 @@ AudioRecord::AudioRecord( mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT), mProxy(NULL), mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE), mPortId(AUDIO_PORT_HANDLE_NONE) { mStatus = set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user, notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags, uid, pid, pAttributes); uid, pid, pAttributes, selectedDeviceId); } AudioRecord::~AudioRecord() Loading Loading @@ -148,7 +148,8 @@ status_t AudioRecord::set( audio_input_flags_t flags, uid_t uid, pid_t pid, const audio_attributes_t* pAttributes) const audio_attributes_t* pAttributes, audio_port_handle_t selectedDeviceId) { ALOGV("set(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, " "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s " Loading @@ -156,6 +157,8 @@ status_t AudioRecord::set( inputSource, sampleRate, format, channelMask, frameCount, notificationFrames, sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid); mSelectedDeviceId = selectedDeviceId; switch (transferType) { case TRANSFER_DEFAULT: if (cbf == NULL || threadCanCallJava) { Loading Loading @@ -489,6 +492,7 @@ status_t AudioRecord::setInputDevice(audio_port_handle_t deviceId) { mAudioRecord->stop(); } android_atomic_or(CBLK_INVALID, &mCblk->mFlags); mProxy->interrupt(); } } return NO_ERROR; Loading media/libaudioclient/include/media/AudioRecord.h +4 −2 Original line number Diff line number Diff line Loading @@ -185,7 +185,8 @@ public: audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE, uid_t uid = AUDIO_UID_INVALID, pid_t pid = -1, const audio_attributes_t* pAttributes = NULL); const audio_attributes_t* pAttributes = NULL, audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE); /* Terminates the AudioRecord and unregisters it from AudioFlinger. * Also destroys all resources associated with the AudioRecord. Loading Loading @@ -223,7 +224,8 @@ public: audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE, uid_t uid = AUDIO_UID_INVALID, pid_t pid = -1, const audio_attributes_t* pAttributes = NULL); const audio_attributes_t* pAttributes = NULL, audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE); /* Result of constructing the AudioRecord. This must be checked for successful initialization * before using any AudioRecord API (except for set()), because using Loading media/libmedia/IMediaRecorder.cpp +89 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ enum { PAUSE, RESUME, GET_METRICS, SET_INPUT_DEVICE, GET_ROUTED_DEVICE_ID, ENABLE_AUDIO_DEVICE_CALLBACK, }; Loading Loading @@ -337,6 +340,57 @@ public: remote()->transact(RELEASE, data, &reply); return reply.readInt32(); } status_t setInputDevice(audio_port_handle_t deviceId) { ALOGV("setInputDevice"); Parcel data, reply; data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); data.writeInt32(deviceId); status_t status = remote()->transact(SET_INPUT_DEVICE, data, &reply); if (status != OK) { ALOGE("setInputDevice binder call failed: %d", status); return status; } return reply.readInt32();; } audio_port_handle_t getRoutedDeviceId(audio_port_handle_t *deviceId) { ALOGV("getRoutedDeviceId"); Parcel data, reply; data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); status_t status = remote()->transact(GET_ROUTED_DEVICE_ID, data, &reply); if (status != OK) { ALOGE("getRoutedDeviceid binder call failed: %d", status); *deviceId = AUDIO_PORT_HANDLE_NONE; return status; } status = reply.readInt32(); if (status != NO_ERROR) { *deviceId = AUDIO_PORT_HANDLE_NONE; } else { *deviceId = reply.readInt32(); } return status; } status_t enableAudioDeviceCallback(bool enabled) { ALOGV("enableAudioDeviceCallback"); Parcel data, reply; data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); data.writeBool(enabled); status_t status = remote()->transact(ENABLE_AUDIO_DEVICE_CALLBACK, data, &reply); if (status != OK) { ALOGE("enableAudioDeviceCallback binder call failed: %d, %d", enabled, status); return status; } return reply.readInt32(); } }; IMPLEMENT_META_INTERFACE(MediaRecorder, "android.media.IMediaRecorder"); Loading Loading @@ -543,6 +597,41 @@ status_t BnMediaRecorder::onTransact( } return NO_ERROR; } break; case SET_INPUT_DEVICE: { ALOGV("SET_INPUT_DEVICE"); CHECK_INTERFACE(IMediaRecorder, data, reply); audio_port_handle_t deviceId; status_t status = data.readInt32(&deviceId); if (status == NO_ERROR) { reply->writeInt32(setInputDevice(deviceId)); } else { reply->writeInt32(BAD_VALUE); } return NO_ERROR; } break; case GET_ROUTED_DEVICE_ID: { ALOGV("GET_ROUTED_DEVICE_ID"); CHECK_INTERFACE(IMediaRecorder, data, reply); audio_port_handle_t deviceId; status_t status = getRoutedDeviceId(&deviceId); reply->writeInt32(status); if (status == NO_ERROR) { reply->writeInt32(deviceId); } return NO_ERROR; } break; case ENABLE_AUDIO_DEVICE_CALLBACK: { ALOGV("ENABLE_AUDIO_DEVICE_CALLBACK"); CHECK_INTERFACE(IMediaRecorder, data, reply); bool enabled; status_t status = data.readBool(&enabled); if (status == NO_ERROR) { reply->writeInt32(enableAudioDeviceCallback(enabled)); } else { reply->writeInt32(BAD_VALUE); } return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } Loading media/libmedia/include/media/IMediaRecorder.h +5 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define ANDROID_IMEDIARECORDER_H #include <binder/IInterface.h> #include <system/audio.h> namespace android { Loading Loading @@ -64,6 +65,10 @@ public: virtual status_t release() = 0; virtual status_t setInputSurface(const sp<PersistentSurface>& surface) = 0; virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() = 0; virtual status_t setInputDevice(audio_port_handle_t deviceId) = 0; virtual status_t getRoutedDeviceId(audio_port_handle_t *deviceId) = 0; virtual status_t enableAudioDeviceCallback(bool enabled) = 0; }; // ---------------------------------------------------------------------------- Loading media/libmedia/include/media/MediaRecorderBase.h +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define MEDIA_RECORDER_BASE_H_ #include <media/AudioSystem.h> #include <media/mediarecorder.h> #include <system/audio.h> Loading Loading @@ -62,6 +63,10 @@ struct MediaRecorderBase { virtual status_t dump(int fd, const Vector<String16>& args) const = 0; virtual status_t setInputSurface(const sp<PersistentSurface>& surface) = 0; virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() const = 0; virtual status_t setInputDevice(audio_port_handle_t deviceId) = 0; virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId) = 0; virtual void setAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback) = 0; virtual status_t enableAudioDeviceCallback(bool enabled) = 0; protected: Loading Loading
media/libaudioclient/AudioRecord.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -89,7 +89,8 @@ AudioRecord::AudioRecord( audio_input_flags_t flags, uid_t uid, pid_t pid, const audio_attributes_t* pAttributes) const audio_attributes_t* pAttributes, audio_port_handle_t selectedDeviceId) : mActive(false), mStatus(NO_INIT), mOpPackageName(opPackageName), Loading @@ -97,12 +98,11 @@ AudioRecord::AudioRecord( mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT), mProxy(NULL), mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE), mPortId(AUDIO_PORT_HANDLE_NONE) { mStatus = set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user, notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags, uid, pid, pAttributes); uid, pid, pAttributes, selectedDeviceId); } AudioRecord::~AudioRecord() Loading Loading @@ -148,7 +148,8 @@ status_t AudioRecord::set( audio_input_flags_t flags, uid_t uid, pid_t pid, const audio_attributes_t* pAttributes) const audio_attributes_t* pAttributes, audio_port_handle_t selectedDeviceId) { ALOGV("set(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, " "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s " Loading @@ -156,6 +157,8 @@ status_t AudioRecord::set( inputSource, sampleRate, format, channelMask, frameCount, notificationFrames, sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid); mSelectedDeviceId = selectedDeviceId; switch (transferType) { case TRANSFER_DEFAULT: if (cbf == NULL || threadCanCallJava) { Loading Loading @@ -489,6 +492,7 @@ status_t AudioRecord::setInputDevice(audio_port_handle_t deviceId) { mAudioRecord->stop(); } android_atomic_or(CBLK_INVALID, &mCblk->mFlags); mProxy->interrupt(); } } return NO_ERROR; Loading
media/libaudioclient/include/media/AudioRecord.h +4 −2 Original line number Diff line number Diff line Loading @@ -185,7 +185,8 @@ public: audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE, uid_t uid = AUDIO_UID_INVALID, pid_t pid = -1, const audio_attributes_t* pAttributes = NULL); const audio_attributes_t* pAttributes = NULL, audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE); /* Terminates the AudioRecord and unregisters it from AudioFlinger. * Also destroys all resources associated with the AudioRecord. Loading Loading @@ -223,7 +224,8 @@ public: audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE, uid_t uid = AUDIO_UID_INVALID, pid_t pid = -1, const audio_attributes_t* pAttributes = NULL); const audio_attributes_t* pAttributes = NULL, audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE); /* Result of constructing the AudioRecord. This must be checked for successful initialization * before using any AudioRecord API (except for set()), because using Loading
media/libmedia/IMediaRecorder.cpp +89 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,9 @@ enum { PAUSE, RESUME, GET_METRICS, SET_INPUT_DEVICE, GET_ROUTED_DEVICE_ID, ENABLE_AUDIO_DEVICE_CALLBACK, }; Loading Loading @@ -337,6 +340,57 @@ public: remote()->transact(RELEASE, data, &reply); return reply.readInt32(); } status_t setInputDevice(audio_port_handle_t deviceId) { ALOGV("setInputDevice"); Parcel data, reply; data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); data.writeInt32(deviceId); status_t status = remote()->transact(SET_INPUT_DEVICE, data, &reply); if (status != OK) { ALOGE("setInputDevice binder call failed: %d", status); return status; } return reply.readInt32();; } audio_port_handle_t getRoutedDeviceId(audio_port_handle_t *deviceId) { ALOGV("getRoutedDeviceId"); Parcel data, reply; data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); status_t status = remote()->transact(GET_ROUTED_DEVICE_ID, data, &reply); if (status != OK) { ALOGE("getRoutedDeviceid binder call failed: %d", status); *deviceId = AUDIO_PORT_HANDLE_NONE; return status; } status = reply.readInt32(); if (status != NO_ERROR) { *deviceId = AUDIO_PORT_HANDLE_NONE; } else { *deviceId = reply.readInt32(); } return status; } status_t enableAudioDeviceCallback(bool enabled) { ALOGV("enableAudioDeviceCallback"); Parcel data, reply; data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); data.writeBool(enabled); status_t status = remote()->transact(ENABLE_AUDIO_DEVICE_CALLBACK, data, &reply); if (status != OK) { ALOGE("enableAudioDeviceCallback binder call failed: %d, %d", enabled, status); return status; } return reply.readInt32(); } }; IMPLEMENT_META_INTERFACE(MediaRecorder, "android.media.IMediaRecorder"); Loading Loading @@ -543,6 +597,41 @@ status_t BnMediaRecorder::onTransact( } return NO_ERROR; } break; case SET_INPUT_DEVICE: { ALOGV("SET_INPUT_DEVICE"); CHECK_INTERFACE(IMediaRecorder, data, reply); audio_port_handle_t deviceId; status_t status = data.readInt32(&deviceId); if (status == NO_ERROR) { reply->writeInt32(setInputDevice(deviceId)); } else { reply->writeInt32(BAD_VALUE); } return NO_ERROR; } break; case GET_ROUTED_DEVICE_ID: { ALOGV("GET_ROUTED_DEVICE_ID"); CHECK_INTERFACE(IMediaRecorder, data, reply); audio_port_handle_t deviceId; status_t status = getRoutedDeviceId(&deviceId); reply->writeInt32(status); if (status == NO_ERROR) { reply->writeInt32(deviceId); } return NO_ERROR; } break; case ENABLE_AUDIO_DEVICE_CALLBACK: { ALOGV("ENABLE_AUDIO_DEVICE_CALLBACK"); CHECK_INTERFACE(IMediaRecorder, data, reply); bool enabled; status_t status = data.readBool(&enabled); if (status == NO_ERROR) { reply->writeInt32(enableAudioDeviceCallback(enabled)); } else { reply->writeInt32(BAD_VALUE); } return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } Loading
media/libmedia/include/media/IMediaRecorder.h +5 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define ANDROID_IMEDIARECORDER_H #include <binder/IInterface.h> #include <system/audio.h> namespace android { Loading Loading @@ -64,6 +65,10 @@ public: virtual status_t release() = 0; virtual status_t setInputSurface(const sp<PersistentSurface>& surface) = 0; virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() = 0; virtual status_t setInputDevice(audio_port_handle_t deviceId) = 0; virtual status_t getRoutedDeviceId(audio_port_handle_t *deviceId) = 0; virtual status_t enableAudioDeviceCallback(bool enabled) = 0; }; // ---------------------------------------------------------------------------- Loading
media/libmedia/include/media/MediaRecorderBase.h +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define MEDIA_RECORDER_BASE_H_ #include <media/AudioSystem.h> #include <media/mediarecorder.h> #include <system/audio.h> Loading Loading @@ -62,6 +63,10 @@ struct MediaRecorderBase { virtual status_t dump(int fd, const Vector<String16>& args) const = 0; virtual status_t setInputSurface(const sp<PersistentSurface>& surface) = 0; virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() const = 0; virtual status_t setInputDevice(audio_port_handle_t deviceId) = 0; virtual status_t getRoutedDeviceId(audio_port_handle_t* deviceId) = 0; virtual void setAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback) = 0; virtual status_t enableAudioDeviceCallback(bool enabled) = 0; protected: Loading