Merge changes Ie33ca07f,I9cc0f1bd
* changes:
Remove RefBase from plugin-side MediaSource
Remove RefBase from MediaExtractor
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index 1c4a80e..9dfb514 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -904,7 +904,6 @@
audio_session_t session,
pid_t pid,
uid_t uid,
- const String16& opPackageName,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
@@ -913,29 +912,35 @@
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return NO_INIT;
return aps->getInputForAttr(
- attr, input, session, pid, uid, opPackageName,
+ attr, input, session, pid, uid,
config, flags, selectedDeviceId, portId);
}
-status_t AudioSystem::startInput(audio_port_handle_t portId, bool *silenced)
+status_t AudioSystem::startInput(audio_io_handle_t input,
+ audio_session_t session,
+ audio_devices_t device,
+ uid_t uid,
+ bool *silenced)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
- return aps->startInput(portId, silenced);
+ return aps->startInput(input, session, device, uid, silenced);
}
-status_t AudioSystem::stopInput(audio_port_handle_t portId)
+status_t AudioSystem::stopInput(audio_io_handle_t input,
+ audio_session_t session)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
- return aps->stopInput(portId);
+ return aps->stopInput(input, session);
}
-void AudioSystem::releaseInput(audio_port_handle_t portId)
+void AudioSystem::releaseInput(audio_io_handle_t input,
+ audio_session_t session)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return;
- aps->releaseInput(portId);
+ aps->releaseInput(input, session);
}
status_t AudioSystem::initStreamVolume(audio_stream_type_t stream,
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index b91e4cf..6478975 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -285,7 +285,6 @@
audio_session_t session,
pid_t pid,
uid_t uid,
- const String16& opPackageName,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
@@ -314,7 +313,6 @@
data.writeInt32(session);
data.writeInt32(pid);
data.writeInt32(uid);
- data.writeString16(opPackageName);
data.write(config, sizeof(audio_config_base_t));
data.writeInt32(flags);
data.writeInt32(*selectedDeviceId);
@@ -333,12 +331,18 @@
return NO_ERROR;
}
- virtual status_t startInput(audio_port_handle_t portId,
+ virtual status_t startInput(audio_io_handle_t input,
+ audio_session_t session,
+ audio_devices_t device,
+ uid_t uid,
bool *silenced)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
- data.writeInt32(portId);
+ data.writeInt32(input);
+ data.writeInt32(session);
+ data.writeInt32(device);
+ data.writeInt32(uid);
data.writeInt32(*silenced ? 1 : 0);
remote()->transact(START_INPUT, data, &reply);
status_t status = static_cast <status_t> (reply.readInt32());
@@ -346,20 +350,24 @@
return status;
}
- virtual status_t stopInput(audio_port_handle_t portId)
+ virtual status_t stopInput(audio_io_handle_t input,
+ audio_session_t session)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
- data.writeInt32(portId);
+ data.writeInt32(input);
+ data.writeInt32(session);
remote()->transact(STOP_INPUT, data, &reply);
return static_cast <status_t> (reply.readInt32());
}
- virtual void releaseInput(audio_port_handle_t portId)
+ virtual void releaseInput(audio_io_handle_t input,
+ audio_session_t session)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
- data.writeInt32(portId);
+ data.writeInt32(input);
+ data.writeInt32(session);
remote()->transact(RELEASE_INPUT, data, &reply);
}
@@ -1026,7 +1034,6 @@
audio_session_t session = (audio_session_t)data.readInt32();
pid_t pid = (pid_t)data.readInt32();
uid_t uid = (uid_t)data.readInt32();
- const String16 opPackageName = data.readString16();
audio_config_base_t config;
memset(&config, 0, sizeof(audio_config_base_t));
data.read(&config, sizeof(audio_config_base_t));
@@ -1034,7 +1041,7 @@
audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32();
audio_port_handle_t portId = (audio_port_handle_t)data.readInt32();
status_t status = getInputForAttr(&attr, &input, session, pid, uid,
- opPackageName, &config,
+ &config,
flags, &selectedDeviceId, &portId);
reply->writeInt32(status);
if (status == NO_ERROR) {
@@ -1047,9 +1054,12 @@
case START_INPUT: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
- audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
+ audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
+ audio_session_t session = static_cast <audio_session_t>(data.readInt32());
+ audio_devices_t device = static_cast <audio_devices_t>(data.readInt32());
+ uid_t uid = static_cast <uid_t>(data.readInt32());
bool silenced = data.readInt32() == 1;
- status_t status = startInput(portId, &silenced);
+ status_t status = startInput(input, session, device, uid, &silenced);
reply->writeInt32(static_cast <uint32_t>(status));
reply->writeInt32(silenced ? 1 : 0);
return NO_ERROR;
@@ -1057,15 +1067,17 @@
case STOP_INPUT: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
- audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
- reply->writeInt32(static_cast <uint32_t>(stopInput(portId)));
+ audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
+ audio_session_t session = static_cast <audio_session_t>(data.readInt32());
+ reply->writeInt32(static_cast <uint32_t>(stopInput(input, session)));
return NO_ERROR;
} break;
case RELEASE_INPUT: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
- audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32());
- releaseInput(portId);
+ audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32());
+ audio_session_t session = static_cast <audio_session_t>(data.readInt32());
+ releaseInput(input, session);
return NO_ERROR;
} break;
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index 22b700d..3c8e7bc 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -241,16 +241,20 @@
audio_session_t session,
pid_t pid,
uid_t uid,
- const String16& opPackageName,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
audio_port_handle_t *portId);
- static status_t startInput(audio_port_handle_t portId,
+ static status_t startInput(audio_io_handle_t input,
+ audio_session_t session,
+ audio_devices_t device,
+ uid_t uid,
bool *silenced);
- static status_t stopInput(audio_port_handle_t portId);
- static void releaseInput(audio_port_handle_t portId);
+ static status_t stopInput(audio_io_handle_t input,
+ audio_session_t session);
+ static void releaseInput(audio_io_handle_t input,
+ audio_session_t session);
static status_t initStreamVolume(audio_stream_type_t stream,
int indexMin,
int indexMax);
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index 949d593..5338927 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -80,15 +80,19 @@
audio_session_t session,
pid_t pid,
uid_t uid,
- const String16& opPackageName,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
audio_port_handle_t *portId) = 0;
- virtual status_t startInput(audio_port_handle_t portId,
+ virtual status_t startInput(audio_io_handle_t input,
+ audio_session_t session,
+ audio_devices_t device,
+ uid_t uid,
bool *silenced) = 0;
- virtual status_t stopInput(audio_port_handle_t portId) = 0;
- virtual void releaseInput(audio_port_handle_t portId) = 0;
+ virtual status_t stopInput(audio_io_handle_t input,
+ audio_session_t session) = 0;
+ virtual void releaseInput(audio_io_handle_t input,
+ audio_session_t session) = 0;
virtual status_t initStreamVolume(audio_stream_type_t stream,
int indexMin,
int indexMax) = 0;
diff --git a/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java b/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
index f96ff70..688aadc 100644
--- a/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
+++ b/packages/MediaComponents/src/com/android/widget/MediaControlView2Impl.java
@@ -49,10 +49,6 @@
private final MediaControlView2 mInstance;
private final ViewProvider mSuperProvider;
- static final String COMMAND_SHOW_SUBTITLE = "showSubtitle";
- static final String COMMAND_HIDE_SUBTITLE = "hideSubtitle";
- static final String COMMAND_SET_FULLSCREEN = "setFullscreen";
-
static final String ARGUMENT_KEY_FULLSCREEN = "fullScreen";
static final String KEY_STATE_CONTAINS_SUBTITLE = "StateContainsSubtitle";
@@ -85,7 +81,6 @@
private boolean mSubtitleIsEnabled;
private boolean mContainsSubtitle;
private boolean mSeekAvailable;
- private View.OnClickListener mNextListener, mPrevListener;
private ImageButton mPlayPauseButton;
private ImageButton mFfwdButton;
private ImageButton mRewButton;
@@ -144,7 +139,7 @@
}
@Override
- public void show_impl(int timeout) {
+ public void show_impl(long timeout) {
if (!mShowing) {
setProgress();
if (mPlayPauseButton != null) {
@@ -186,92 +181,65 @@
}
@Override
- public void showSubtitle_impl() {
- mController.sendCommand(COMMAND_SHOW_SUBTITLE, null, null);
- }
-
- @Override
- public void hideSubtitle_impl() {
- mController.sendCommand(COMMAND_HIDE_SUBTITLE, null, null);
- }
-
- @Override
- public void setPrevNextListeners_impl(View.OnClickListener next, View.OnClickListener prev) {
- mNextListener = next;
- mPrevListener = prev;
-
- if (mNextButton != null) {
- mNextButton.setOnClickListener(mNextListener);
- mNextButton.setEnabled(mNextListener != null);
- mNextButton.setVisibility(View.VISIBLE);
- }
- if (mPrevButton != null) {
- mPrevButton.setOnClickListener(mPrevListener);
- mPrevButton.setEnabled(mPrevListener != null);
- mPrevButton.setVisibility(View.VISIBLE);
- }
- }
-
- @Override
- public void setButtonVisibility_impl(int button, boolean visible) {
+ public void setButtonVisibility_impl(int button, int visibility) {
switch (button) {
case MediaControlView2.BUTTON_PLAY_PAUSE:
if (mPlayPauseButton != null && canPause()) {
- mPlayPauseButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mPlayPauseButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_FFWD:
if (mFfwdButton != null && canSeekForward()) {
- mFfwdButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mFfwdButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_REW:
if (mRewButton != null && canSeekBackward()) {
- mRewButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mRewButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_NEXT:
// TODO: this button is not visible unless its listener is manually set. Should this
// function still be provided?
if (mNextButton != null) {
- mNextButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mNextButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_PREV:
// TODO: this button is not visible unless its listener is manually set. Should this
// function still be provided?
if (mPrevButton != null) {
- mPrevButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mPrevButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_SUBTITLE:
if (mSubtitleButton != null && mContainsSubtitle) {
- mSubtitleButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mSubtitleButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_FULL_SCREEN:
if (mFullScreenButton != null) {
- mFullScreenButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mFullScreenButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_OVERFLOW:
if (mOverflowButtonRight != null) {
- mOverflowButtonRight.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mOverflowButtonRight.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_MUTE:
if (mMuteButton != null) {
- mMuteButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mMuteButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_ASPECT_RATIO:
if (mAspectRationButton != null) {
- mAspectRationButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mAspectRationButton.setVisibility(visibility);
}
break;
case MediaControlView2.BUTTON_SETTINGS:
if (mSettingsButton != null) {
- mSettingsButton.setVisibility((visible) ? View.VISIBLE : View.GONE);
+ mSettingsButton.setVisibility(visibility);
}
break;
default:
@@ -426,11 +394,11 @@
}
mNextButton = v.findViewById(R.id.next);
if (mNextButton != null) {
- mNextButton.setVisibility(View.GONE);
+ mNextButton.setOnClickListener(mNextListener);
}
mPrevButton = v.findViewById(R.id.prev);
if (mPrevButton != null) {
- mPrevButton.setVisibility(View.GONE);
+ mPrevButton.setOnClickListener(mPrevListener);
}
mBasicControls = v.findViewById(R.id.basic_controls);
@@ -693,6 +661,22 @@
}
};
+ private final View.OnClickListener mNextListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mControls.skipToNext();
+ mInstance.show(DEFAULT_TIMEOUT_MS);
+ }
+ };
+
+ private final View.OnClickListener mPrevListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mControls.skipToPrevious();
+ mInstance.show(DEFAULT_TIMEOUT_MS);
+ }
+ };
+
private final View.OnClickListener mSubtitleListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -700,13 +684,13 @@
mSubtitleButton.setImageDrawable(
ApiHelper.getLibResources().getDrawable(
R.drawable.ic_media_subtitle_enabled, null));
- mInstance.showSubtitle();
+ mController.sendCommand(MediaControlView2.COMMAND_SHOW_SUBTITLE, null, null);
mSubtitleIsEnabled = true;
} else {
mSubtitleButton.setImageDrawable(
ApiHelper.getLibResources().getDrawable(
R.drawable.ic_media_subtitle_disabled, null));
- mInstance.hideSubtitle();
+ mController.sendCommand(MediaControlView2.COMMAND_HIDE_SUBTITLE, null, null);
mSubtitleIsEnabled = false;
}
mInstance.show(DEFAULT_TIMEOUT_MS);
@@ -728,7 +712,7 @@
}
Bundle args = new Bundle();
args.putBoolean(ARGUMENT_KEY_FULLSCREEN, isEnteringFullScreen);
- mController.sendCommand(COMMAND_SET_FULLSCREEN, args, null);
+ mController.sendCommand(MediaControlView2.COMMAND_SET_FULLSCREEN, args, null);
mIsFullScreen = isEnteringFullScreen;
mInstance.show(DEFAULT_TIMEOUT_MS);
diff --git a/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java b/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
index c82ce36..38ade41 100644
--- a/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
+++ b/packages/MediaComponents/src/com/android/widget/VideoView2Impl.java
@@ -897,13 +897,13 @@
mRouteSessionCallback.onCommand(command, args, receiver);
} else {
switch (command) {
- case MediaControlView2Impl.COMMAND_SHOW_SUBTITLE:
+ case MediaControlView2.COMMAND_SHOW_SUBTITLE:
mInstance.showSubtitle();
break;
- case MediaControlView2Impl.COMMAND_HIDE_SUBTITLE:
+ case MediaControlView2.COMMAND_HIDE_SUBTITLE:
mInstance.hideSubtitle();
break;
- case MediaControlView2Impl.COMMAND_SET_FULLSCREEN:
+ case MediaControlView2.COMMAND_SET_FULLSCREEN:
if (mOnFullScreenRequestListener != null) {
mOnFullScreenRequestListener.onFullScreenRequest(
mInstance,
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index b801752..592273e 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -321,7 +321,6 @@
actualSessionId,
client.clientPid,
client.clientUid,
- client.packageName,
config,
AUDIO_INPUT_FLAG_MMAP_NOIRQ, deviceId, &portId);
}
@@ -341,7 +340,7 @@
if (direction == MmapStreamInterface::DIRECTION_OUTPUT) {
AudioSystem::releaseOutput(io, streamType, actualSessionId);
} else {
- AudioSystem::releaseInput(portId);
+ AudioSystem::releaseInput(io, actualSessionId);
}
ret = NO_INIT;
}
@@ -1622,6 +1621,12 @@
clientPid = callingPid;
}
+ // check calling permissions
+ if (!recordingAllowed(input.opPackageName, input.clientInfo.clientTid, clientUid)) {
+ ALOGE("createRecord() permission denied: recording not allowed");
+ lStatus = PERMISSION_DENIED;
+ goto Exit;
+ }
// we don't yet support anything other than linear PCM
if (!audio_is_valid_format(input.config.format) || !audio_is_linear_pcm(input.config.format)) {
ALOGE("createRecord() invalid format %#x", input.config.format);
@@ -1658,7 +1663,7 @@
// release previously opened input if retrying.
if (output.inputId != AUDIO_IO_HANDLE_NONE) {
recordTrack.clear();
- AudioSystem::releaseInput(portId);
+ AudioSystem::releaseInput(output.inputId, sessionId);
output.inputId = AUDIO_IO_HANDLE_NONE;
}
lStatus = AudioSystem::getInputForAttr(&input.attr, &output.inputId,
@@ -1666,7 +1671,6 @@
// FIXME compare to AudioTrack
clientPid,
clientUid,
- input.opPackageName,
&input.config,
output.flags, &output.selectedDeviceId, &portId);
@@ -1735,7 +1739,7 @@
}
recordTrack.clear();
if (output.inputId != AUDIO_IO_HANDLE_NONE) {
- AudioSystem::releaseInput(portId);
+ AudioSystem::releaseInput(output.inputId, sessionId);
}
}
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 7bfe802..420e6e1 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -6936,7 +6936,8 @@
if (recordTrack->isExternalTrack()) {
mLock.unlock();
bool silenced;
- status = AudioSystem::startInput(recordTrack->portId(), &silenced);
+ status = AudioSystem::startInput(mId, recordTrack->sessionId(),
+ mInDevice, recordTrack->uid(), &silenced);
mLock.lock();
// FIXME should verify that recordTrack is still in mActiveTracks
if (status != NO_ERROR) {
@@ -6968,7 +6969,7 @@
startError:
if (recordTrack->isExternalTrack()) {
- AudioSystem::stopInput(recordTrack->portId());
+ AudioSystem::stopInput(mId, recordTrack->sessionId());
}
recordTrack->clearSyncStartEvent();
// FIXME I wonder why we do not reset the state here?
@@ -7741,7 +7742,7 @@
if (isOutput()) {
AudioSystem::releaseOutput(mId, streamType(), mSessionId);
} else {
- AudioSystem::releaseInput(mPortId);
+ AudioSystem::releaseInput(mId, mSessionId);
}
}
@@ -7801,6 +7802,10 @@
return NO_ERROR;
}
+ if (!isOutput() && !recordingAllowed(client.packageName, client.clientPid, client.clientUid)) {
+ return PERMISSION_DENIED;
+ }
+
audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
audio_io_handle_t io = mId;
@@ -7832,7 +7837,6 @@
mSessionId,
client.clientPid,
client.clientUid,
- client.packageName,
&config,
AUDIO_INPUT_FLAG_MMAP_NOIRQ,
&deviceId,
@@ -7851,7 +7855,7 @@
} else {
// TODO: Block recording for idle UIDs (b/72134552)
bool silenced;
- ret = AudioSystem::startInput(portId, &silenced);
+ ret = AudioSystem::startInput(mId, mSessionId, mInDevice, client.clientUid, &silenced);
}
// abort if start is rejected by audio policy manager
@@ -7861,7 +7865,7 @@
if (isOutput()) {
AudioSystem::releaseOutput(mId, streamType(), mSessionId);
} else {
- AudioSystem::releaseInput(portId);
+ AudioSystem::releaseInput(mId, mSessionId);
}
} else {
mHalStream->stop();
@@ -7918,8 +7922,8 @@
AudioSystem::stopOutput(mId, streamType(), track->sessionId());
AudioSystem::releaseOutput(mId, streamType(), track->sessionId());
} else {
- AudioSystem::stopInput(track->portId());
- AudioSystem::releaseInput(track->portId());
+ AudioSystem::stopInput(mId, track->sessionId());
+ AudioSystem::releaseInput(mId, track->sessionId());
}
sp<EffectChain> chain = getEffectChain_l(track->sessionId());
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index 06bbf1e..cdd8ca0 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -1687,7 +1687,7 @@
if (thread != 0) {
RecordThread *recordThread = (RecordThread *)thread.get();
if (recordThread->stop(this) && isExternalTrack()) {
- AudioSystem::stopInput(mPortId);
+ AudioSystem::stopInput(mThreadIoHandle, mSessionId);
}
}
}
@@ -1699,9 +1699,9 @@
{
if (isExternalTrack()) {
if (mState == ACTIVE || mState == RESUMING) {
- AudioSystem::stopInput(mPortId);
+ AudioSystem::stopInput(mThreadIoHandle, mSessionId);
}
- AudioSystem::releaseInput(mPortId);
+ AudioSystem::releaseInput(mThreadIoHandle, mSessionId);
}
sp<ThreadBase> thread = mThread.promote();
if (thread != 0) {
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 306de3f..f1d7d86 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -287,7 +287,6 @@
audio_session_t session,
pid_t pid,
uid_t uid,
- const String16& opPackageName,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
@@ -296,7 +295,6 @@
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
-
// already checked by client, but double-check in case the client wrapper is bypassed
if (attr->source < AUDIO_SOURCE_DEFAULT && attr->source >= AUDIO_SOURCE_CNT &&
attr->source != AUDIO_SOURCE_HOTWORD && attr->source != AUDIO_SOURCE_FM_TUNER) {
@@ -320,13 +318,6 @@
pid = callingPid;
}
- // check calling permissions
- if (!recordingAllowed(opPackageName, pid, uid)) {
- ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
- __func__, uid, pid);
- return PERMISSION_DENIED;
- }
-
if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed(pid, uid)) {
return BAD_VALUE;
}
@@ -376,13 +367,6 @@
}
return status;
}
-
- sp<AudioRecordClient> client =
- new AudioRecordClient(*attr, *input, uid, pid, opPackageName, session);
- client->active = false;
- client->isConcurrent = false;
- client->isVirtualDevice = false; //TODO : update from APM->getInputForAttr()
- mAudioRecordClients.add(*portId, client);
}
if (audioPolicyEffects != 0) {
@@ -395,38 +379,23 @@
return NO_ERROR;
}
-status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenced)
+status_t AudioPolicyService::startInput(audio_io_handle_t input,
+ audio_session_t session,
+ audio_devices_t device,
+ uid_t uid,
+ bool *silenced)
{
+ // If UID inactive it records silence until becoming active
+ *silenced = !mUidPolicy->isUidActive(uid) && !is_virtual_input_device(device);
+
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
- sp<AudioRecordClient> client;
- {
- Mutex::Autolock _l(mLock);
-
- ssize_t index = mAudioRecordClients.indexOfKey(portId);
- if (index < 0) {
- return INVALID_OPERATION;
- }
- client = mAudioRecordClients.valueAt(index);
- }
-
- // check calling permissions
- if (!recordingAllowed(client->opPackageName, client->pid, client->uid)) {
- ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
- __func__, client->uid, client->pid);
- return PERMISSION_DENIED;
- }
-
- // If UID inactive it records silence until becoming active
- *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice;
Mutex::Autolock _l(mLock);
AudioPolicyInterface::concurrency_type__mask_t concurrency =
AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE;
-
- status_t status = mAudioPolicyManager->startInput(
- client->input, client->session, *silenced, &concurrency);
+ status_t status = mAudioPolicyManager->startInput(input, session, *silenced, &concurrency);
if (status == NO_ERROR) {
LOG_ALWAYS_FATAL_IF(concurrency & ~AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL,
@@ -444,52 +413,38 @@
return status;
}
-status_t AudioPolicyService::stopInput(audio_port_handle_t portId)
+status_t AudioPolicyService::stopInput(audio_io_handle_t input,
+ audio_session_t session)
{
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
Mutex::Autolock _l(mLock);
- ssize_t index = mAudioRecordClients.indexOfKey(portId);
- if (index < 0) {
- return INVALID_OPERATION;
- }
- sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
-
- return mAudioPolicyManager->stopInput(client->input, client->session);
+ return mAudioPolicyManager->stopInput(input, session);
}
-void AudioPolicyService::releaseInput(audio_port_handle_t portId)
+void AudioPolicyService::releaseInput(audio_io_handle_t input,
+ audio_session_t session)
{
if (mAudioPolicyManager == NULL) {
return;
}
sp<AudioPolicyEffects>audioPolicyEffects;
- sp<AudioRecordClient> client;
{
Mutex::Autolock _l(mLock);
audioPolicyEffects = mAudioPolicyEffects;
- ssize_t index = mAudioRecordClients.indexOfKey(portId);
- if (index < 0) {
- return;
- }
- client = mAudioRecordClients.valueAt(index);
- mAudioRecordClients.removeItem(portId);
- }
- if (client == 0) {
- return;
}
if (audioPolicyEffects != 0) {
// release audio processors from the input
- status_t status = audioPolicyEffects->releaseInputEffects(client->input, client->session);
+ status_t status = audioPolicyEffects->releaseInputEffects(input, session);
if(status != NO_ERROR) {
- ALOGW("Failed to release effects on input %d", client->input);
+ ALOGW("Failed to release effects on input %d", input);
}
}
{
Mutex::Autolock _l(mLock);
- mAudioPolicyManager->releaseInput(client->input, client->session);
+ mAudioPolicyManager->releaseInput(input, session);
}
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index bfa3ef4..c21aa58 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -98,15 +98,19 @@
audio_session_t session,
pid_t pid,
uid_t uid,
- const String16& opPackageName,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId = NULL,
audio_port_handle_t *portId = NULL);
- virtual status_t startInput(audio_port_handle_t portId,
+ virtual status_t startInput(audio_io_handle_t input,
+ audio_session_t session,
+ audio_devices_t device,
+ uid_t uid,
bool *silenced);
- virtual status_t stopInput(audio_port_handle_t portId);
- virtual void releaseInput(audio_port_handle_t portId);
+ virtual status_t stopInput(audio_io_handle_t input,
+ audio_session_t session);
+ virtual void releaseInput(audio_io_handle_t input,
+ audio_session_t session);
virtual status_t initStreamVolume(audio_stream_type_t stream,
int indexMin,
int indexMax);
@@ -607,31 +611,6 @@
bool mAudioPortCallbacksEnabled;
};
- // --- AudioRecordClient ---
- // Information about each registered AudioRecord client
- // (between calls to getInputForAttr() and releaseInput())
- class AudioRecordClient : public RefBase {
- public:
- AudioRecordClient(const audio_attributes_t attributes,
- const audio_io_handle_t input, uid_t uid, pid_t pid,
- const String16& opPackageName, const audio_session_t session) :
- attributes(attributes),
- input(input), uid(uid), pid(pid),
- opPackageName(opPackageName), session(session),
- active(false), isConcurrent(false), isVirtualDevice(false) {}
- virtual ~AudioRecordClient() {}
-
- const audio_attributes_t attributes; // source, flags ...
- const audio_io_handle_t input; // audio HAL input IO handle
- const uid_t uid; // client UID
- const pid_t pid; // client PID
- const String16 opPackageName; // client package name
- const audio_session_t session; // audio session ID
- bool active; // Capture is active or inactive
- bool isConcurrent; // is allowed to concurrent capture
- bool isVirtualDevice; // uses vitual device: updated by APM::getInputForAttr()
- };
-
// Internal dump utilities.
status_t dumpPermissionDenial(int fd);
@@ -657,7 +636,6 @@
audio_mode_t mPhoneState;
sp<UidPolicy> mUidPolicy;
- DefaultKeyedVector< audio_port_handle_t, sp<AudioRecordClient> > mAudioRecordClients;
};
} // namespace android