You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
7.4 KiB
199 lines
7.4 KiB
/*
|
|
**
|
|
** Copyright 2008, The Android Open Source Project
|
|
**
|
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
** you may not use this file except in compliance with the License.
|
|
** You may obtain a copy of the License at
|
|
**
|
|
** http://www.apache.org/licenses/LICENSE-2.0
|
|
**
|
|
** Unless required by applicable law or agreed to in writing, software
|
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
** See the License for the specific language governing permissions and
|
|
** limitations under the License.
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <binder/Parcel.h>
|
|
#include <binder/IMemory.h>
|
|
#include <media/IMediaCodecList.h>
|
|
#include <media/IMediaHTTPService.h>
|
|
#include <media/IMediaPlayerService.h>
|
|
#include <media/IMediaPlayer.h>
|
|
#include <media/IMediaRecorder.h>
|
|
#include <media/IOMX.h>
|
|
#include <media/IRemoteDisplay.h>
|
|
#include <media/IRemoteDisplayClient.h>
|
|
#include <media/IStreamSource.h>
|
|
|
|
#include <utils/Errors.h> // for status_t
|
|
#include <utils/String8.h>
|
|
|
|
namespace android {
|
|
|
|
using android::content::AttributionSourceState;
|
|
|
|
enum {
|
|
CREATE = IBinder::FIRST_CALL_TRANSACTION,
|
|
CREATE_MEDIA_RECORDER,
|
|
CREATE_METADATA_RETRIEVER,
|
|
ADD_BATTERY_DATA,
|
|
PULL_BATTERY_DATA,
|
|
LISTEN_FOR_REMOTE_DISPLAY,
|
|
GET_CODEC_LIST,
|
|
};
|
|
|
|
class BpMediaPlayerService: public BpInterface<IMediaPlayerService>
|
|
{
|
|
public:
|
|
explicit BpMediaPlayerService(const sp<IBinder>& impl)
|
|
: BpInterface<IMediaPlayerService>(impl)
|
|
{
|
|
}
|
|
|
|
virtual sp<IMediaMetadataRetriever> createMetadataRetriever()
|
|
{
|
|
Parcel data, reply;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
remote()->transact(CREATE_METADATA_RETRIEVER, data, &reply);
|
|
return interface_cast<IMediaMetadataRetriever>(reply.readStrongBinder());
|
|
}
|
|
|
|
virtual sp<IMediaPlayer> create(
|
|
const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
|
|
const AttributionSourceState& attributionSource) {
|
|
Parcel data, reply;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
data.writeStrongBinder(IInterface::asBinder(client));
|
|
data.writeInt32(audioSessionId);
|
|
data.writeParcelable(attributionSource);
|
|
|
|
remote()->transact(CREATE, data, &reply);
|
|
return interface_cast<IMediaPlayer>(reply.readStrongBinder());
|
|
}
|
|
|
|
virtual sp<IMediaRecorder> createMediaRecorder(const AttributionSourceState& attributionSource)
|
|
{
|
|
Parcel data, reply;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
data.writeParcelable(attributionSource);
|
|
remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
|
|
return interface_cast<IMediaRecorder>(reply.readStrongBinder());
|
|
}
|
|
|
|
virtual void addBatteryData(uint32_t params) {
|
|
Parcel data, reply;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
data.writeInt32(params);
|
|
remote()->transact(ADD_BATTERY_DATA, data, &reply);
|
|
}
|
|
|
|
virtual status_t pullBatteryData(Parcel* reply) {
|
|
Parcel data;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
return remote()->transact(PULL_BATTERY_DATA, data, reply);
|
|
}
|
|
|
|
virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
|
|
const sp<IRemoteDisplayClient>& client, const String8& iface)
|
|
{
|
|
Parcel data, reply;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
data.writeString16(opPackageName);
|
|
data.writeStrongBinder(IInterface::asBinder(client));
|
|
data.writeString8(iface);
|
|
remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);
|
|
return interface_cast<IRemoteDisplay>(reply.readStrongBinder());
|
|
}
|
|
|
|
virtual sp<IMediaCodecList> getCodecList() const {
|
|
Parcel data, reply;
|
|
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
|
|
remote()->transact(GET_CODEC_LIST, data, &reply);
|
|
return interface_cast<IMediaCodecList>(reply.readStrongBinder());
|
|
}
|
|
};
|
|
|
|
IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
status_t BnMediaPlayerService::onTransact(
|
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
|
|
{
|
|
switch (code) {
|
|
case CREATE: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
sp<IMediaPlayerClient> client =
|
|
interface_cast<IMediaPlayerClient>(data.readStrongBinder());
|
|
audio_session_t audioSessionId = (audio_session_t) data.readInt32();
|
|
AttributionSourceState attributionSource;
|
|
status_t status = data.readParcelable(&attributionSource);
|
|
if (status != NO_ERROR) {
|
|
return status;
|
|
}
|
|
sp<IMediaPlayer> player = create(client, audioSessionId, attributionSource);
|
|
reply->writeStrongBinder(IInterface::asBinder(player));
|
|
return NO_ERROR;
|
|
} break;
|
|
case CREATE_MEDIA_RECORDER: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
AttributionSourceState attributionSource;
|
|
status_t status = data.readParcelable(&attributionSource);
|
|
if (status != NO_ERROR) {
|
|
return status;
|
|
}
|
|
sp<IMediaRecorder> recorder = createMediaRecorder(attributionSource);
|
|
reply->writeStrongBinder(IInterface::asBinder(recorder));
|
|
return NO_ERROR;
|
|
} break;
|
|
case CREATE_METADATA_RETRIEVER: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
sp<IMediaMetadataRetriever> retriever = createMetadataRetriever();
|
|
reply->writeStrongBinder(IInterface::asBinder(retriever));
|
|
return NO_ERROR;
|
|
} break;
|
|
case ADD_BATTERY_DATA: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
uint32_t params = data.readInt32();
|
|
addBatteryData(params);
|
|
return NO_ERROR;
|
|
} break;
|
|
case PULL_BATTERY_DATA: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
pullBatteryData(reply);
|
|
return NO_ERROR;
|
|
} break;
|
|
case LISTEN_FOR_REMOTE_DISPLAY: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
const String16 opPackageName = data.readString16();
|
|
sp<IRemoteDisplayClient> client(
|
|
interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));
|
|
if (client == NULL) {
|
|
reply->writeStrongBinder(NULL);
|
|
return NO_ERROR;
|
|
}
|
|
String8 iface(data.readString8());
|
|
sp<IRemoteDisplay> display(listenForRemoteDisplay(opPackageName, client, iface));
|
|
reply->writeStrongBinder(IInterface::asBinder(display));
|
|
return NO_ERROR;
|
|
} break;
|
|
case GET_CODEC_LIST: {
|
|
CHECK_INTERFACE(IMediaPlayerService, data, reply);
|
|
sp<IMediaCodecList> mcl = getCodecList();
|
|
reply->writeStrongBinder(IInterface::asBinder(mcl));
|
|
return NO_ERROR;
|
|
} break;
|
|
default:
|
|
return BBinder::onTransact(code, data, reply, flags);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
} // namespace android
|