189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
301cff464978aa0f749f42650180b45ea56cb17deJean-Baptiste Queru ** Copyright 2008, The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef ANDROID_MEDIARECORDERCLIENT_H
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define ANDROID_MEDIARECORDERCLIENT_H
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin#include <media/AudioSystem.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
249c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa#include <android/hardware/media/omx/1.0/IOmx.h>
259c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2861c2351da89cb281b2dfd56c6c6779ccb4bc1172Dan Willemsenstruct MediaRecorderBase;
29dac6a31a33ba53fb93850670cdddd1e6515dadceGloria Wangclass MediaPlayerService;
304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Liclass ICameraRecordingProxy;
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaRecorderClient : public BnMediaRecorder
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
349c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    typedef ::android::hardware::media::omx::V1_0::IOmx IOmx;
359c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
369c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    class ServiceDeathNotifier :
379c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            public IBinder::DeathRecipient,
389c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            public ::android::hardware::hidl_death_recipient
396dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    {
406dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    public:
416dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        ServiceDeathNotifier(
426dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen                const sp<IBinder>& service,
436dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen                const sp<IMediaRecorderClient>& listener,
446dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen                int which);
459c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        ServiceDeathNotifier(
469c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa                const sp<IOmx>& omx,
479c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa                const sp<IMediaRecorderClient>& listener,
489c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa                int which);
496dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        virtual ~ServiceDeathNotifier();
506dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        virtual void binderDied(const wp<IBinder>& who);
519c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        virtual void serviceDied(
529c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa                uint64_t cookie,
539c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa                const wp<::android::hidl::base::V1_0::IBase>& who);
549c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        void unlinkToDeath();
556dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    private:
566dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        int mWhich;
576dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        sp<IBinder> mService;
589c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        sp<IOmx> mOmx;
596dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen        wp<IMediaRecorderClient> mListener;
606dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen    };
616dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
62fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    class AudioDeviceUpdatedNotifier: public AudioSystem::AudioDeviceCallback
63fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    {
64fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    public:
65fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin        AudioDeviceUpdatedNotifier(const sp<IMediaRecorderClient>& listener);
66fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin        virtual ~AudioDeviceUpdatedNotifier();
67fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin        virtual void onAudioDeviceUpdate(
68fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin                audio_io_handle_t audioIo,
69fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin                audio_port_handle_t deviceId);
70fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    private:
71fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin        wp<IMediaRecorderClient> mListener;
72fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    };
73fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin
74f9c81464b9494082fa7cdff9f70c5402e8ac78c0Pawin Vongmasa    void clearDeathNotifiers_l();
759c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
77d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    virtual     status_t   setCamera(const sp<hardware::ICamera>& camera,
78b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi                                    const sp<ICameraRecordingProxy>& proxy);
7999617adda9bc46c43f511f0940bc735c73de61deMathias Agopian    virtual     status_t   setPreviewSurface(const sp<IGraphicBufferProducer>& surface);
80b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setVideoSource(int vs);
81b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setAudioSource(int as);
82b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setOutputFormat(int of);
83b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setVideoEncoder(int ve);
84b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setAudioEncoder(int ae);
85fe44e4f74fe2582cbf012687059278dbcbdaa6f7Hangyu Kuang    virtual     status_t   setOutputFile(int fd);
86fe44e4f74fe2582cbf012687059278dbcbdaa6f7Hangyu Kuang    virtual     status_t   setNextOutputFile(int fd);
87b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setVideoSize(int width, int height);
88b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setVideoFrameRate(int frames_per_second);
89b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setParameters(const String8& params);
90b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   setListener(
91b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi                              const sp<IMediaRecorderClient>& listener);
92ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    virtual     status_t   setClientName(const String16& clientName);
93b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   prepare();
94b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   getMaxAmplitude(int* max);
95ac4e4189db77dc0af7671b162d11be5ccec69339Ray Essick    virtual     status_t   getMetrics(Parcel* reply);
96b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   start();
97b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   stop();
98b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   reset();
99d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    virtual     status_t   pause();
100d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim    virtual     status_t   resume();
101b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   init();
102b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   close();
103b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual     status_t   release();
1046d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    virtual     status_t   dump(int fd, const Vector<String16>& args);
105addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    virtual     status_t   setInputSurface(const sp<PersistentSurface>& surface);
1068ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    virtual     sp<IGraphicBufferProducer> querySurfaceMediaSource();
107fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    virtual     status_t   setInputDevice(audio_port_handle_t deviceId);
108fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    virtual     status_t   getRoutedDeviceId(audio_port_handle_t* deviceId);
109fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    virtual     status_t   enableAudioDeviceCallback(bool enabled);
110609850df59219845a8c4ebe18a2687447ea570ccjiabin    virtual     status_t   getActiveMicrophones(
111609850df59219845a8c4ebe18a2687447ea570ccjiabin                              std::vector<media::MicrophoneInfo>* activeMicrophones);
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate:
114b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    friend class           MediaPlayerService;  // for accessing private constructor
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
116b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi                           MediaRecorderClient(
117b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi                                   const sp<MediaPlayerService>& service,
118be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                                               pid_t pid,
119be71aa29a3c86d2e01cd17839d2a72ab09a1bce5Svet Ganov                                                               const String16& opPackageName);
120b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    virtual                ~MediaRecorderClient();
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1229c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    sp<ServiceDeathNotifier> mCameraDeathListener;
1239c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    sp<ServiceDeathNotifier> mCodecDeathListener;
124fec2f93fae282ad10bbb5e3fcce9f60eff2cfb48jiabin    sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedNotifier;
1256dc3a3e2292454f94c015da45f1ebfc6a493e736Marco Nelissen
126b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    pid_t                  mPid;
127b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    Mutex                  mLock;
128b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    MediaRecorderBase      *mRecorder;
129b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    sp<MediaPlayerService> mMediaPlayerService;
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_MEDIARECORDERCLIENT_H
135