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