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