blob: 9446c89b9d87e3d90d1084392185747b19eeb248 [file] [log] [blame]
/*
* Copyright (c) 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 "android_audio_output_threadsafe_callbacks.h"
#include "android_audio_output.h"
AndroidAudioOutputThreadSafeCallbackAO::AndroidAudioOutputThreadSafeCallbackAO(void* aObserver,
uint32 aDepth,
const char* aAOname,
int32 aPriority)
:ThreadSafeCallbackAO(aObserver, aDepth, aAOname, aPriority)
{
}
AndroidAudioOutputThreadSafeCallbackAO::~AndroidAudioOutputThreadSafeCallbackAO()
{
}
OsclReturnCode AndroidAudioOutputThreadSafeCallbackAO::ProcessEvent(OsclAny* EventData)
{
// In this case, ProcessEvent calls the method of the primary test AO to process the Event
if (iObserver != NULL)
{
AndroidAudioOutput* ptr = (AndroidAudioOutput*) iObserver;
// Call RunIfNotReady() for the AudioMIO
if(ptr->IsAdded())
{
ptr->RunIfNotReady();
}
}
return OsclSuccess;
}
#if PROCESS_MULTIPLE_EVENTS_IN_CALLBACK
void AndroidAudioOutputThreadSafeCallbackAO::Run()
{
OsclAny *param;
OsclReturnCode status = OsclSuccess;
// Process multiple events in one attempt
do
{
param = Dequeue(status);
if((status == OsclSuccess) || (status == OsclPending))
{
ProcessEvent(param);
}
}while(status == OsclSuccess);
}
OsclAny* AndroidAudioOutputThreadSafeCallbackAO::Dequeue(OsclReturnCode &status)
{
OsclAny *param;
OsclProcStatus::eOsclProcError sema_status;
status = OsclSuccess;
Mutex.Lock();
if(Q->NumElem == 0)
{
status = OsclFailure;
Mutex.Unlock();
return NULL;
}
param = (Q->pFirst[Q->index_out]).pData;
Q->index_out++;
if(Q->index_out == Q->MaxNumElements)
Q->index_out = 0;
Q->NumElem--;
if(Q->NumElem == 0)
{
// Call PendForExec() only when there are no more elements in the queue
// Else, continue in the do-while loop
PendForExec();
status = OsclPending;
}
Mutex.Unlock();
sema_status = RemoteThreadCtrlSema.Signal();
if(sema_status != OsclProcStatus::SUCCESS_ERROR)
{
status = OsclFailure;
return NULL;
}
return param;
}
#endif