mAudioSessionId = AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
mHwSync = AudioSystem::getAudioHwSyncForSession((audio_session_t) mAudioSessionId);
format->setInt32("feature-tunneled-playback", 1);
format->setInt32("audio-hw-sync", mHwSync);
audio_attributes_t attr;
memset(&attr, 0, sizeof(attr));
attr.usage = AUDIO_USAGE_MEDIA;
attr.content_type = AUDIO_CONTENT_TYPE_MUSIC;
attr.flags = (audio_flags_mask_t)(AUDIO_FLAG_MUTE_HAPTIC | AUDIO_FLAG_HW_AV_SYNC);
size_t frameCount;
AudioTrack::getMinFrameCount(&frameCount, AUDIO_STREAM_DEFAULT, sampleRate);
ALOGD("frameCount = %d", frameCount);
state->mAudioTrack = new AudioTrack(AttributionSourceState());
state->mAudioTrack->set(AUDIO_STREAM_DEFAULT,
sampleRate,
AUDIO_FORMAT_PCM_16_BIT,
audio_channel_out_mask_from_count(channelCount),
frameCount * 4,
AUDIO_OUTPUT_FLAG_NONE,
NULL,
NULL,
0,
0,
true,
(audio_session_t)mAudioSessionId,
AudioTrack::TRANSFER_SYNC,
NULL,
AttributionSourceState(),
&attr
);
char AvSyncHeader[20];
AvSyncHeader[0] = 0x55;
AvSyncHeader[1] = 0x55;
AvSyncHeader[2] = 0x00;
AvSyncHeader[3] = 0x02;
AvSyncHeader[4] = info->mSize >> 24;
AvSyncHeader[5] = info->mSize >> 16;
AvSyncHeader[6] = info->mSize >> 8;
AvSyncHeader[7] = info->mSize;
AvSyncHeader[8] = (info->mPresentationTimeUs*1000 >> 32) >> 24;
AvSyncHeader[9] = (info->mPresentationTimeUs*1000 >> 32) >> 16;
AvSyncHeader[10] = (info->mPresentationTimeUs*1000 >> 32) >> 8;
AvSyncHeader[11] = (info->mPresentationTimeUs*1000 >> 32);
AvSyncHeader[12] = (info->mPresentationTimeUs*1000 & 0xffffffff) >> 24;
AvSyncHeader[13] = (info->mPresentationTimeUs*1000 & 0xffffffff) >> 16;
AvSyncHeader[14] = (info->mPresentationTimeUs*1000 & 0xffffffff) >> 8;
AvSyncHeader[15] = (info->mPresentationTimeUs*1000 & 0xffffffff);
AvSyncHeader[16] = 0x00;
AvSyncHeader[17] = 0x00;
AvSyncHeader[18] = 0x00;
AvSyncHeader[19] = 0x14;
ssize_t nbytes1 = state->mAudioTrack->write(AvSyncHeader, 20);
ssize_t nbytes = state->mAudioTrack->write(
buffer->base() + info->mOffset, copy);