RingBufferParcelable.cpp revision 5ed503c7a66c90f93759c90237a9b432dbd93f9f
1e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk/* 2e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Copyright 2015 The Android Open Source Project 3e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * 4e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * you may not use this file except in compliance with the License. 6e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * You may obtain a copy of the License at 7e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * 8e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 9e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * 10e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * Unless required by applicable law or agreed to in writing, software 11e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * See the License for the specific language governing permissions and 14e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * limitations under the License. 15e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk */ 16e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#define LOG_TAG "AAudio" 18e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk//#define LOG_NDEBUG 0 19e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk#include <utils/Log.h> 20e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 21d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include <new> 22d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include <stdint.h> 23d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk 245ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudioDefinitions.h> 255ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudio.h> 26d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk 27d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include "client/AudioStreamInternal.h" 28d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include "core/AudioStream.h" 29d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include "core/AudioStreamBuilder.h" 30d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include "legacy/AudioStreamRecord.h" 31d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk#include "legacy/AudioStreamTrack.h" 32e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 335ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing namespace aaudio; 34e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 35e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk/* 36e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk * AudioStreamBuilder 37e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk */ 38e1ce491a25faf06fdeab00dd938515f71f28b095Phil BurkAudioStreamBuilder::AudioStreamBuilder() { 39e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk} 40e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 41e1ce491a25faf06fdeab00dd938515f71f28b095Phil BurkAudioStreamBuilder::~AudioStreamBuilder() { 42e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk} 43e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 445ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkaaudio_result_t AudioStreamBuilder::build(AudioStream** streamPtr) { 45e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk // TODO Is there a better place to put the code that decides which class to use? 46d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk AudioStream* audioStream = nullptr; 475ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk const aaudio_sharing_mode_t sharingMode = getSharingMode(); 48e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk switch (getDirection()) { 495ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk case AAUDIO_DIRECTION_INPUT: 50e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk switch (sharingMode) { 515ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk case AAUDIO_SHARING_MODE_LEGACY: 52d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk audioStream = new(std::nothrow) AudioStreamRecord(); 53e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 54e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk default: 55e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk ALOGE("AudioStreamBuilder(): bad sharing mode = %d", sharingMode); 565ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_ERROR_ILLEGAL_ARGUMENT; 57e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 58e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk } 59e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 605ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk case AAUDIO_DIRECTION_OUTPUT: 61e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk switch (sharingMode) { 625ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk case AAUDIO_SHARING_MODE_LEGACY: 63d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk audioStream = new(std::nothrow) AudioStreamTrack(); 64d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk break; 655ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk case AAUDIO_SHARING_MODE_EXCLUSIVE: 66d8bdcabbac30d48ed17fa76c83cb9ee95c290a07Phil Burk audioStream = new(std::nothrow) AudioStreamInternal(); 67e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 68e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk default: 69e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk ALOGE("AudioStreamBuilder(): bad sharing mode = %d", sharingMode); 705ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_ERROR_ILLEGAL_ARGUMENT; 71e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 72e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk } 73e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 74e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk default: 75e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk ALOGE("AudioStreamBuilder(): bad direction = %d", getDirection()); 765ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_ERROR_ILLEGAL_ARGUMENT; 77e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk break; 78e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk } 79e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk if (audioStream == nullptr) { 805ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk return AAUDIO_ERROR_NO_MEMORY; 81e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk } 82e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk ALOGD("AudioStreamBuilder(): created audioStream = %p", audioStream); 83e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk 84e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk // TODO maybe move this out of build and pass the builder to the constructors 85e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk // Open the stream using the parameters from the builder. 865ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk const aaudio_result_t result = audioStream->open(*this); 875ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk if (result != AAUDIO_OK) { 88e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk delete audioStream; 89e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk } else { 90e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk *streamPtr = audioStream; 91e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk } 92e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk return result; 93e1ce491a25faf06fdeab00dd938515f71f28b095Phil Burk} 94