16b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta/*
26b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * Copyright (C) 2015 The Android Open Source Project
36b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta *
46b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * Licensed under the Apache License, Version 2.0 (the "License");
56b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * you may not use this file except in compliance with the License.
66b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * You may obtain a copy of the License at
76b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta *
86b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta *      http://www.apache.org/licenses/LICENSE-2.0
96b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta *
106b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * Unless required by applicable law or agreed to in writing, software
116b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * distributed under the License is distributed on an "AS IS" BASIS,
126b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * See the License for the specific language governing permissions and
146b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * limitations under the License.
156b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta */
166b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
176b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta//#define LOG_NDEBUG 0
18b4a42e7b9c277cfd71a575cbdb104013855b80cdBluetooth Build Test#define LOG_TAG "bt_btif_avrcp_audio_track"
19b4a42e7b9c277cfd71a575cbdb104013855b80cdBluetooth Build Test
206b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#include "btif_avrcp_audio_track.h"
216b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
22f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include <base/logging.h>
236b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#include <media/AudioTrack.h>
246b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#include <utils/StrongPointer.h>
256b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
26254bc17491dc45976c2ed741ceaa0709a97dc6ceJoseph Pirozzo#include "bt_target.h"
276b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#include "osi/include/log.h"
286b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
296b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptausing namespace android;
306b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsontypedef struct { android::sp<android::AudioTrack> track; } BtifAvrcpAudioTrack;
326b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
33b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen#if (DUMP_PCM_DATA == TRUE)
346bd442f543972b072ef2cbbcf2f7c91202de1045Myles WatsonFILE* outputPcmSampleFile;
356b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptachar outputFilename[50] = "/data/misc/bluedroid/output_sample.pcm";
366b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif
376b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid* BtifAvrcpAudioTrackCreate(int trackFreq, int channelType) {
396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btCreateTrack freq %d  channel %d ",
406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson              __func__, trackFreq, channelType);
416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  sp<android::AudioTrack> track = new android::AudioTrack(
426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      AUDIO_STREAM_MUSIC, trackFreq, AUDIO_FORMAT_PCM_16_BIT, channelType,
436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      (size_t)0 /*frameCount*/, (audio_output_flags_t)AUDIO_OUTPUT_FLAG_FAST,
446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      NULL /*callback_t*/, NULL /*void* user*/, 0 /*notificationFrames*/,
456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      AUDIO_SESSION_ALLOCATE, android::AudioTrack::TRANSFER_SYNC);
46f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(track != NULL);
476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = new BtifAvrcpAudioTrack;
49f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(trackHolder != NULL);
506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  trackHolder->track = track;
516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (trackHolder->track->initCheck() != 0) {
536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return nullptr;
546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
556b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
56b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen#if (DUMP_PCM_DATA == TRUE)
576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  outputPcmSampleFile = fopen(outputFilename, "ab");
586b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif
596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  trackHolder->track->setVolume(1, 1);
606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return (void*)trackHolder;
616b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta}
626b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid BtifAvrcpAudioTrackStart(void* handle) {
646664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal  if (handle == NULL) {
656664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    LOG_ERROR(LOG_TAG, "%s: handle is null!", __func__);
666664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    return;
676664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal  }
686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
69f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(trackHolder != NULL);
70f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(trackHolder->track != NULL);
716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  trackHolder->track->start();
736b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta}
746b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid BtifAvrcpAudioTrackStop(void* handle) {
766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (handle == NULL) {
776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_DEBUG(LOG_TAG, "%s handle is null.", __func__);
786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return;
796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (trackHolder != NULL && trackHolder->track != NULL) {
826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    trackHolder->track->stop();
846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
856b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta}
866b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid BtifAvrcpAudioTrackDelete(void* handle) {
886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (handle == NULL) {
896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_DEBUG(LOG_TAG, "%s handle is null.", __func__);
906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return;
916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (trackHolder != NULL && trackHolder->track != NULL) {
946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    delete trackHolder;
966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
976b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
98b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen#if (DUMP_PCM_DATA == TRUE)
996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (outputPcmSampleFile) {
1006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    fclose(outputPcmSampleFile);
1016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  outputPcmSampleFile = NULL;
1036b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif
1046b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta}
1056b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
1066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid BtifAvrcpAudioTrackPause(void* handle) {
1076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (handle == NULL) {
1086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_DEBUG(LOG_TAG, "%s handle is null.", __func__);
1096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return;
1106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
1126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (trackHolder != NULL && trackHolder->track != NULL) {
1136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btStartTrack", __func__);
1146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    trackHolder->track->pause();
1156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    trackHolder->track->flush();
1166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1176b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta}
1186b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta
1196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid BtifAvrcpSetAudioTrackGain(void* handle, float gain) {
1206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (handle == NULL) {
1216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_DEBUG(LOG_TAG, "%s handle is null.", __func__);
1226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return;
1236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
1256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (trackHolder != NULL && trackHolder->track != NULL) {
1266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    LOG_VERBOSE(LOG_TAG, "%s set gain %f", __func__, gain);
1276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    trackHolder->track->setVolume(gain);
1286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
129501d67199bfc5bf9c2d2a32f6eac5600320795fdSanket Agarwal}
130501d67199bfc5bf9c2d2a32f6eac5600320795fdSanket Agarwal
1316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonint BtifAvrcpAudioTrackWriteData(void* handle, void* audioBuffer,
1326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                 int bufferlen) {
1336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BtifAvrcpAudioTrack* trackHolder = static_cast<BtifAvrcpAudioTrack*>(handle);
134f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(trackHolder != NULL);
135f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He  CHECK(trackHolder->track != NULL);
1366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  int retval = -1;
137b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen#if (DUMP_PCM_DATA == TRUE)
1386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (outputPcmSampleFile) {
1396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    fwrite((audioBuffer), 1, (size_t)bufferlen, outputPcmSampleFile);
1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1416b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif
1426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  retval = trackHolder->track->write(audioBuffer, (size_t)bufferlen);
1436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  LOG_VERBOSE(LOG_TAG, "%s Track.cpp: btWriteData len = %d ret = %d", __func__,
1446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson              bufferlen, retval);
1456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return retval;
1466b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta}
147