1/*
2**
3** Copyright 2008, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#ifndef ANDROID_AUDIO_OUTPUT_H
19#define ANDROID_AUDIO_OUTPUT_H
20
21#include <utils/Errors.h>
22
23#include "android_audio_mio.h"
24#include "utils/Timers.h"
25
26using namespace android;
27
28class AndroidAudioOutput : public AndroidAudioMIO
29{
30public:
31    OSCL_IMPORT_REF AndroidAudioOutput();
32    OSCL_IMPORT_REF ~AndroidAudioOutput();
33
34    virtual PVMFCommandId QueryUUID(const PvmfMimeString& aMimeType, Oscl_Vector<PVUuid,
35            OsclMemAllocator>& aUuids, bool aExactUuidsOnly=false,
36            const OsclAny* aContext=NULL);
37
38    virtual PVMFCommandId QueryInterface(const PVUuid& aUuid, PVInterface*& aInterfacePtr,
39            const OsclAny* aContext=NULL);
40
41    virtual void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
42            int num_elements, PvmiKvp * & aRet_kvp);
43
44    virtual PVMFCommandId DiscardData(PVMFTimestamp aTimestamp=0, const OsclAny* aContext=NULL);
45
46    virtual void cancelCommand(PVMFCommandId aCmdId);
47
48    virtual PVMFCommandId Stop(const OsclAny* aContext=NULL);
49    virtual PVMFCommandId Reset(const OsclAny* aContext=NULL);
50
51
52private:
53
54    // Audio output request handling
55    // this mio queues the requests, the audio output thread dequeues and processes them
56    class OSSRequest
57    {
58        public:
59            OSSRequest(uint8* data, uint32 len, PVMFCommandId id, const OsclAny* ctx, const PVMFTimestamp& ts) :
60                iData(data), iDataLen(len), iCmdId(id), iContext(ctx), iTimestamp(ts)
61        {}
62            uint8* iData;
63            uint32 iDataLen;
64            PVMFCommandId iCmdId;
65            const OsclAny* iContext;
66            PVMFTimestamp iTimestamp;
67    };
68
69    virtual void writeAudioBuffer(uint8* aData, uint32 aDataLen, PVMFCommandId cmdId,
70            OsclAny* aContext, PVMFTimestamp aTimestamp);
71
72    virtual void Run();
73
74    virtual void returnAllBuffers();
75
76    void RequestAndWaitForThreadExit();
77
78    static int start_audout_thread_func(TOsclThreadFuncArg arg);
79    int audout_thread_func();
80
81    // semaphores used to communicate with the audio output thread
82    OsclSemaphore* iAudioThreadSem;
83    OsclSemaphore* iAudioThreadTermSem;
84    OsclSemaphore* iAudioThreadReturnSem;
85    OsclSemaphore* iAudioThreadCreatedSem;
86
87    volatile bool iExitAudioThread;
88    volatile bool iReturnBuffers;
89
90    // active timing
91    AndroidAudioMIOActiveTimingSupport* iActiveTiming;
92
93    // oss request queue, needs to use lock mechanism to access
94    Oscl_Vector<OSSRequest,OsclMemAllocator> iOSSRequestQueue;
95
96    // lock used to access the oss request queue
97    OsclMutex iOSSRequestQueueLock;
98
99    // number of bytes in an input frame
100    int iInputFrameSizeInBytes;
101
102    // Wallclock time in nano secs to find the interval between write calls done to device.
103    nsecs_t     iClockTimeOfWriting_ns;
104};
105
106#endif // ANDROID_AUDIO_OUTPUT_H
107
108