1010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten/* 2010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * Copyright (C) 2012 The Android Open Source Project 3010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * 4010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * you may not use this file except in compliance with the License. 6010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * You may obtain a copy of the License at 7010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * 8010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * 10010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * Unless required by applicable law or agreed to in writing, software 11010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * See the License for the specific language governing permissions and 14010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten * limitations under the License. 15010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten */ 16010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 17010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten#define LOG_TAG "AudioStreamInSource" 18010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten//#define LOG_NDEBUG 0 19010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 20010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten#include <cutils/compiler.h> 21010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten#include <utils/Log.h> 222dd4bdd715f586d4d30cf90cc6fc2bbfbce60fe0Glenn Kasten#include <media/nbaio/AudioStreamInSource.h> 23010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 24010662326b9c43c703725f933e95e0897f8a6bddGlenn Kastennamespace android { 25010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 26010662326b9c43c703725f933e95e0897f8a6bddGlenn KastenAudioStreamInSource::AudioStreamInSource(audio_stream_in *stream) : 27010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten NBAIO_Source(), 28010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mStream(stream), 29010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mStreamBufferSizeBytes(0), 30010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFramesOverrun(0), 31010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mOverruns(0) 32010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 33010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten ALOG_ASSERT(stream != NULL); 34010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 35010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 36010662326b9c43c703725f933e95e0897f8a6bddGlenn KastenAudioStreamInSource::~AudioStreamInSource() 37010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 38010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 39010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 40010662326b9c43c703725f933e95e0897f8a6bddGlenn Kastenssize_t AudioStreamInSource::negotiate(const NBAIO_Format offers[], size_t numOffers, 41010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten NBAIO_Format counterOffers[], size_t& numCounterOffers) 42010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 436e0d67d7b496ce17c0970a4ffd3a6f808860949cGlenn Kasten if (!Format_isValid(mFormat)) { 44010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mStreamBufferSizeBytes = mStream->common.get_buffer_size(&mStream->common); 45010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten audio_format_t streamFormat = mStream->common.get_format(&mStream->common); 4643d9b8706b3916ee0f1d745a2832f792c3406ca8Glenn Kasten uint32_t sampleRate = mStream->common.get_sample_rate(&mStream->common); 4743d9b8706b3916ee0f1d745a2832f792c3406ca8Glenn Kasten audio_channel_mask_t channelMask = 4843d9b8706b3916ee0f1d745a2832f792c3406ca8Glenn Kasten (audio_channel_mask_t) mStream->common.get_channels(&mStream->common); 49e541269be94f3a1072932d51537905b120ef4733Andy Hung mFormat = Format_from_SR_C(sampleRate, 50e541269be94f3a1072932d51537905b120ef4733Andy Hung audio_channel_count_from_in_mask(channelMask), streamFormat); 5143d9b8706b3916ee0f1d745a2832f792c3406ca8Glenn Kasten mFrameSize = Format_frameSize(mFormat); 52010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 53010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return NBAIO_Source::negotiate(offers, numOffers, counterOffers, numCounterOffers); 54010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 55010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 56818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hungint64_t AudioStreamInSource::framesOverrun() 57010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 58010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten uint32_t framesOverrun = mStream->get_input_frames_lost(mStream); 59010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (framesOverrun > 0) { 60010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFramesOverrun += framesOverrun; 61010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten // FIXME only increment for contiguous ranges 62010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten ++mOverruns; 63010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 64010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return mFramesOverrun; 65010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 66010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 67d79072e9dff59f767cce2cda1caab80ce5a0815bGlenn Kastenssize_t AudioStreamInSource::read(void *buffer, size_t count) 68010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten{ 696e0d67d7b496ce17c0970a4ffd3a6f808860949cGlenn Kasten if (CC_UNLIKELY(!Format_isValid(mFormat))) { 70010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return NEGOTIATE; 71010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 724d693d6b8cc1283f92f5301daf19a07abc772a2bGlenn Kasten ssize_t bytesRead = mStream->read(mStream, buffer, count * mFrameSize); 73010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten if (bytesRead > 0) { 744d693d6b8cc1283f92f5301daf19a07abc772a2bGlenn Kasten size_t framesRead = bytesRead / mFrameSize; 75010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten mFramesRead += framesRead; 76010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return framesRead; 77010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } else { 78010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten return bytesRead; 79010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten } 80010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} 81010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten 82010662326b9c43c703725f933e95e0897f8a6bddGlenn Kasten} // namespace android 83