blob: d455f7758c68d7bd364250f6a0ced7253c0c39fe [file] [log] [blame]
/*
**
** 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.
*/
#ifndef ANDROID_AUDIO_OUTPUT_H
#define ANDROID_AUDIO_OUTPUT_H
#include <utils/Errors.h>
#include "android_audio_mio.h"
#include "utils/Timers.h"
using namespace android;
class AndroidAudioOutput : public AndroidAudioMIO
{
public:
OSCL_IMPORT_REF AndroidAudioOutput();
OSCL_IMPORT_REF ~AndroidAudioOutput();
virtual PVMFCommandId QueryUUID(const PvmfMimeString& aMimeType, Oscl_Vector<PVUuid,
OsclMemAllocator>& aUuids, bool aExactUuidsOnly=false,
const OsclAny* aContext=NULL);
virtual PVMFCommandId QueryInterface(const PVUuid& aUuid, PVInterface*& aInterfacePtr,
const OsclAny* aContext=NULL);
virtual void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
int num_elements, PvmiKvp * & aRet_kvp);
virtual PVMFCommandId DiscardData(PVMFTimestamp aTimestamp=0, const OsclAny* aContext=NULL);
virtual void cancelCommand(PVMFCommandId aCmdId);
virtual PVMFCommandId Stop(const OsclAny* aContext=NULL);
virtual PVMFCommandId Reset(const OsclAny* aContext=NULL);
private:
// Audio output request handling
// this mio queues the requests, the audio output thread dequeues and processes them
class OSSRequest
{
public:
OSSRequest(uint8* data, uint32 len, PVMFCommandId id, const OsclAny* ctx, const PVMFTimestamp& ts) :
iData(data), iDataLen(len), iCmdId(id), iContext(ctx), iTimestamp(ts)
{}
uint8* iData;
uint32 iDataLen;
PVMFCommandId iCmdId;
const OsclAny* iContext;
PVMFTimestamp iTimestamp;
};
virtual void writeAudioBuffer(uint8* aData, uint32 aDataLen, PVMFCommandId cmdId,
OsclAny* aContext, PVMFTimestamp aTimestamp);
virtual void Run();
virtual void returnAllBuffers();
void RequestAndWaitForThreadExit();
static int start_audout_thread_func(TOsclThreadFuncArg arg);
int audout_thread_func();
// semaphores used to communicate with the audio output thread
OsclSemaphore* iAudioThreadSem;
OsclSemaphore* iAudioThreadTermSem;
OsclSemaphore* iAudioThreadReturnSem;
OsclSemaphore* iAudioThreadCreatedSem;
volatile bool iExitAudioThread;
volatile bool iReturnBuffers;
// active timing
AndroidAudioMIOActiveTimingSupport* iActiveTiming;
// oss request queue, needs to use lock mechanism to access
Oscl_Vector<OSSRequest,OsclMemAllocator> iOSSRequestQueue;
// lock used to access the oss request queue
OsclMutex iOSSRequestQueueLock;
// number of bytes in an input frame
int iInputFrameSizeInBytes;
// Wallclock time in nano secs to find the interval between write calls done to device.
nsecs_t iClockTimeOfWriting_ns;
};
#endif // ANDROID_AUDIO_OUTPUT_H