blob: 733e113c6eb87b0ff63a79bcf7993e7444171d55 [file] [log] [blame]
/**
* Copyright (C) 2020 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 <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <media/AudioSystem.h>
#include "../includes/common.h"
using namespace android;
#define MAX_NUMBER_OF_AUDIO_SESSIONS 1024
#define MAX_NUMBER_OF_THREADS 5
#define MAX_NUMBER_OF_ACQUIRE_SESSION_THREADS 2
struct pocAudioSessionCtxt {
audio_session_t audioSession[MAX_NUMBER_OF_AUDIO_SESSIONS];
volatile bool startThread;
};
static void *acquireSoundTriggerSessionThread(void *arg) {
int i = 0;
pocAudioSessionCtxt *ctxt = (pocAudioSessionCtxt *)arg;
if (!ctxt) {
return nullptr;
}
time_t currentTime = start_timer();
while (timer_active(currentTime)) {
if (ctxt->startThread) {
audio_io_handle_t ioHandle = 0;
audio_devices_t device = AUDIO_DEVICE_NONE;
AudioSystem::acquireSoundTriggerSession(&(ctxt->audioSession[++i]), &ioHandle, &device);
if (i >= MAX_NUMBER_OF_AUDIO_SESSIONS) {
i = 0;
}
}
}
return nullptr;
}
static void *releaseSoundTriggerSessionThread(void *arg) {
int i = 0;
pocAudioSessionCtxt *ctxt = (pocAudioSessionCtxt *)arg;
if (!ctxt) {
return nullptr;
}
time_t currentTime = start_timer();
while (timer_active(currentTime)) {
if (ctxt->startThread) {
AudioSystem::releaseSoundTriggerSession(ctxt->audioSession[++i]);
if (i >= MAX_NUMBER_OF_AUDIO_SESSIONS) {
i = 0;
}
}
}
return nullptr;
}
int main() {
pocAudioSessionCtxt ctxt;
pthread_t thread[MAX_NUMBER_OF_THREADS];
ctxt.startThread = false;
for (int i = 0; i < MAX_NUMBER_OF_ACQUIRE_SESSION_THREADS; ++i) {
pthread_create(&thread[i], nullptr, acquireSoundTriggerSessionThread,
&ctxt);
}
for (int i = MAX_NUMBER_OF_ACQUIRE_SESSION_THREADS; i < MAX_NUMBER_OF_THREADS;
++i) {
pthread_create(&thread[i], nullptr, releaseSoundTriggerSessionThread,
&ctxt);
}
ctxt.startThread = true;
for (int i = 0; i < MAX_NUMBER_OF_THREADS; ++i) {
pthread_join(thread[i], nullptr);
}
return EXIT_SUCCESS;
}