1901f65deb49786f4dffd39ac965c0bb681392c0bjiabin/* 2901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * Copyright 2017 The Android Open Source Project 3901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * 4901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * Licensed under the Apache License, Version 2.0 (the "License"); 5901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * you may not use this file except in compliance with the License. 6901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * You may obtain a copy of the License at 7901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * 8901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * http://www.apache.org/licenses/LICENSE-2.0 9901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * 10901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * Unless required by applicable law or agreed to in writing, software 11901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * distributed under the License is distributed on an "AS IS" BASIS, 12901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * See the License for the specific language governing permissions and 14901f65deb49786f4dffd39ac965c0bb681392c0bjiabin * limitations under the License. 15901f65deb49786f4dffd39ac965c0bb681392c0bjiabin */ 16901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 17901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 18901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#define LOG_TAG "AAudio" 19901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#include <utils/Log.h> 20901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#include <hardware/audio.h> 21901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 22901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#include "AAudioStreamParameters.h" 23901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 24901f65deb49786f4dffd39ac965c0bb681392c0bjiabinusing namespace aaudio; 25901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 26901f65deb49786f4dffd39ac965c0bb681392c0bjiabin// TODO These defines should be moved to a central place in audio. 27901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#define SAMPLES_PER_FRAME_MIN 1 28901f65deb49786f4dffd39ac965c0bb681392c0bjiabin// TODO Remove 8 channel limitation. 29901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#define SAMPLES_PER_FRAME_MAX FCC_8 30901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#define SAMPLE_RATE_HZ_MIN 8000 31901f65deb49786f4dffd39ac965c0bb681392c0bjiabin// HDMI supports up to 32 channels at 1536000 Hz. 32901f65deb49786f4dffd39ac965c0bb681392c0bjiabin#define SAMPLE_RATE_HZ_MAX 1600000 33901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 34901f65deb49786f4dffd39ac965c0bb681392c0bjiabinAAudioStreamParameters::AAudioStreamParameters() {} 35901f65deb49786f4dffd39ac965c0bb681392c0bjiabinAAudioStreamParameters::~AAudioStreamParameters() {} 36901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 3739f02ddfbfd9313370d862a6c4727826379a319aPhil Burkvoid AAudioStreamParameters::copyFrom(const AAudioStreamParameters &other) { 3839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mSamplesPerFrame = other.mSamplesPerFrame; 3939f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mSampleRate = other.mSampleRate; 4039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mDeviceId = other.mDeviceId; 4139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mSharingMode = other.mSharingMode; 4239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mAudioFormat = other.mAudioFormat; 4339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mDirection = other.mDirection; 4439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mBufferCapacity = other.mBufferCapacity; 4539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk} 4639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 47901f65deb49786f4dffd39ac965c0bb681392c0bjiabinaaudio_result_t AAudioStreamParameters::validate() const { 48901f65deb49786f4dffd39ac965c0bb681392c0bjiabin if (mSamplesPerFrame != AAUDIO_UNSPECIFIED 49901f65deb49786f4dffd39ac965c0bb681392c0bjiabin && (mSamplesPerFrame < SAMPLES_PER_FRAME_MIN || mSamplesPerFrame > SAMPLES_PER_FRAME_MAX)) { 50901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGE("AAudioStreamParameters: channelCount out of range = %d", mSamplesPerFrame); 51901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_ERROR_OUT_OF_RANGE; 52901f65deb49786f4dffd39ac965c0bb681392c0bjiabin } 53901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 54901f65deb49786f4dffd39ac965c0bb681392c0bjiabin if (mDeviceId < 0) { 55901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGE("AAudioStreamParameters: deviceId out of range = %d", mDeviceId); 56901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_ERROR_OUT_OF_RANGE; 57901f65deb49786f4dffd39ac965c0bb681392c0bjiabin } 58901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 59901f65deb49786f4dffd39ac965c0bb681392c0bjiabin switch (mSharingMode) { 60901f65deb49786f4dffd39ac965c0bb681392c0bjiabin case AAUDIO_SHARING_MODE_EXCLUSIVE: 61901f65deb49786f4dffd39ac965c0bb681392c0bjiabin case AAUDIO_SHARING_MODE_SHARED: 62901f65deb49786f4dffd39ac965c0bb681392c0bjiabin break; 63901f65deb49786f4dffd39ac965c0bb681392c0bjiabin default: 64901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGE("AAudioStreamParameters: illegal sharingMode = %d", mSharingMode); 65901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_ERROR_ILLEGAL_ARGUMENT; 66901f65deb49786f4dffd39ac965c0bb681392c0bjiabin // break; 67901f65deb49786f4dffd39ac965c0bb681392c0bjiabin } 68901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 69901f65deb49786f4dffd39ac965c0bb681392c0bjiabin switch (mAudioFormat) { 70901f65deb49786f4dffd39ac965c0bb681392c0bjiabin case AAUDIO_FORMAT_UNSPECIFIED: 71901f65deb49786f4dffd39ac965c0bb681392c0bjiabin case AAUDIO_FORMAT_PCM_I16: 72901f65deb49786f4dffd39ac965c0bb681392c0bjiabin case AAUDIO_FORMAT_PCM_FLOAT: 73901f65deb49786f4dffd39ac965c0bb681392c0bjiabin break; // valid 74901f65deb49786f4dffd39ac965c0bb681392c0bjiabin default: 75901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGE("AAudioStreamParameters: audioFormat not valid = %d", mAudioFormat); 76901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_ERROR_INVALID_FORMAT; 77901f65deb49786f4dffd39ac965c0bb681392c0bjiabin // break; 78901f65deb49786f4dffd39ac965c0bb681392c0bjiabin } 79901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 80901f65deb49786f4dffd39ac965c0bb681392c0bjiabin if (mSampleRate != AAUDIO_UNSPECIFIED 81901f65deb49786f4dffd39ac965c0bb681392c0bjiabin && (mSampleRate < SAMPLE_RATE_HZ_MIN || mSampleRate > SAMPLE_RATE_HZ_MAX)) { 82901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGE("AAudioStreamParameters: sampleRate out of range = %d", mSampleRate); 83901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_ERROR_INVALID_RATE; 84901f65deb49786f4dffd39ac965c0bb681392c0bjiabin } 85901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 86901f65deb49786f4dffd39ac965c0bb681392c0bjiabin if (mBufferCapacity < 0) { 87901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGE("AAudioStreamParameters: bufferCapacity out of range = %d", mBufferCapacity); 88901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_ERROR_OUT_OF_RANGE; 89901f65deb49786f4dffd39ac965c0bb681392c0bjiabin } 90901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 9139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk switch (mDirection) { 9239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk case AAUDIO_DIRECTION_INPUT: 9339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk case AAUDIO_DIRECTION_OUTPUT: 9439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk break; // valid 9539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk default: 9639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk ALOGE("AAudioStreamParameters: direction not valid = %d", mDirection); 9739f02ddfbfd9313370d862a6c4727826379a319aPhil Burk return AAUDIO_ERROR_ILLEGAL_ARGUMENT; 9839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk // break; 9939f02ddfbfd9313370d862a6c4727826379a319aPhil Burk } 10039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 101901f65deb49786f4dffd39ac965c0bb681392c0bjiabin return AAUDIO_OK; 102901f65deb49786f4dffd39ac965c0bb681392c0bjiabin} 103901f65deb49786f4dffd39ac965c0bb681392c0bjiabin 104901f65deb49786f4dffd39ac965c0bb681392c0bjiabinvoid AAudioStreamParameters::dump() const { 105901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGD("AAudioStreamParameters mDeviceId = %d", mDeviceId); 106901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGD("AAudioStreamParameters mSampleRate = %d", mSampleRate); 107901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGD("AAudioStreamParameters mSamplesPerFrame = %d", mSamplesPerFrame); 108901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGD("AAudioStreamParameters mSharingMode = %d", (int)mSharingMode); 109901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGD("AAudioStreamParameters mAudioFormat = %d", (int)mAudioFormat); 11039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk ALOGD("AAudioStreamParameters mDirection = %d", mDirection); 111901f65deb49786f4dffd39ac965c0bb681392c0bjiabin ALOGD("AAudioStreamParameters mBufferCapacity = %d", mBufferCapacity); 11239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk} 11339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 114