diff options
-rw-r--r-- | camera/Camera.cpp | 11 | ||||
-rw-r--r-- | camera/ICameraService.cpp | 19 | ||||
-rw-r--r-- | include/camera/Camera.h | 3 | ||||
-rw-r--r-- | include/camera/ICameraService.h | 7 | ||||
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 2 |
5 files changed, 34 insertions, 8 deletions
diff --git a/camera/Camera.cpp b/camera/Camera.cpp index f19c502..3346b1f 100644 --- a/camera/Camera.cpp +++ b/camera/Camera.cpp @@ -95,13 +95,20 @@ Camera::~Camera() disconnect(); } -sp<Camera> Camera::connect() +int32_t Camera::getNumberOfCameras() +{ + const sp<ICameraService>& cs = getCameraService(); + if (cs == 0) return 0; + return cs->getNumberOfCameras(); +} + +sp<Camera> Camera::connect(int cameraId) { LOGV("connect"); sp<Camera> c = new Camera(); const sp<ICameraService>& cs = getCameraService(); if (cs != 0) { - c->mCamera = cs->connect(c); + c->mCamera = cs->connect(c, cameraId); } if (c->mCamera != 0) { c->mCamera->asBinder()->linkToDeath(c); diff --git a/camera/ICameraService.cpp b/camera/ICameraService.cpp index 46b5478..db1dca6 100644 --- a/camera/ICameraService.cpp +++ b/camera/ICameraService.cpp @@ -34,12 +34,22 @@ public: { } + // get number of cameras available + virtual int32_t getNumberOfCameras() + { + Parcel data, reply; + data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); + remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply); + return reply.readInt32(); + } + // connect to camera service - virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient) + virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId) { Parcel data, reply; data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); data.writeStrongBinder(cameraClient->asBinder()); + data.writeInt32(cameraId); remote()->transact(BnCameraService::CONNECT, data, &reply); return interface_cast<ICamera>(reply.readStrongBinder()); } @@ -53,10 +63,15 @@ status_t BnCameraService::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { + case GET_NUMBER_OF_CAMERAS: { + CHECK_INTERFACE(ICameraService, data, reply); + reply->writeInt32(getNumberOfCameras()); + return NO_ERROR; + } break; case CONNECT: { CHECK_INTERFACE(ICameraService, data, reply); sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder()); - sp<ICamera> camera = connect(cameraClient); + sp<ICamera> camera = connect(cameraClient, data.readInt32()); reply->writeStrongBinder(camera->asBinder()); return NO_ERROR; } break; diff --git a/include/camera/Camera.h b/include/camera/Camera.h index ee2b30c..1beac27 100644 --- a/include/camera/Camera.h +++ b/include/camera/Camera.h @@ -113,7 +113,8 @@ class Camera : public BnCameraClient, public IBinder::DeathRecipient public: // construct a camera client from an existing remote static sp<Camera> create(const sp<ICamera>& camera); - static sp<Camera> connect(); + static int32_t getNumberOfCameras(); + static sp<Camera> connect(int cameraId); ~Camera(); void init(); diff --git a/include/camera/ICameraService.h b/include/camera/ICameraService.h index 82b1283..dcd434f 100644 --- a/include/camera/ICameraService.h +++ b/include/camera/ICameraService.h @@ -30,13 +30,16 @@ class ICameraService : public IInterface { public: enum { - CONNECT = IBinder::FIRST_CALL_TRANSACTION, + GET_NUMBER_OF_CAMERAS = IBinder::FIRST_CALL_TRANSACTION, + CONNECT }; public: DECLARE_META_INTERFACE(CameraService); - virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient) = 0; + virtual int32_t getNumberOfCameras() = 0; + virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, + int cameraId) = 0; }; // ---------------------------------------------------------------------------- diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index b046a9c..038c3b3 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -106,7 +106,7 @@ void CameraSourceListener::postDataTimestamp( // static CameraSource *CameraSource::Create() { - sp<Camera> camera = Camera::connect(); + sp<Camera> camera = Camera::connect(0); if (camera.get() == NULL) { return NULL; |