blob: fc34de8bff6de72b0d5e6d976171c6caba805579 [file] [log] [blame]
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MEGA_COMMON_STREAMBASE_H
#define MEGA_COMMON_STREAMBASE_H
#include <cstdint>
class AudioSink;
class StreamBase {
public:
//
// Error Codes
// These values must be kept in sync with the equivalent symbols in
// org.hyphonate.megaaudio.common.Streambase.java
//
enum Result {
OK = 0,
ERROR_UNKNOWN = -1,
ERROR_UNSUPPORTED = -2,
ERROR_INVALID_STATE = -3
};
StreamBase() :
mChannelCount(0),
mSampleRate(0),
mRouteDeviceId(ROUTING_DEVICE_NONE),
mBufferSizeInFrames(-1) {}
virtual ~StreamBase() {}
//
// Attributes
//
static const int32_t ROUTING_DEVICE_NONE = -1;
int32_t getRoutedDeviceId() const { return mRouteDeviceId; }
int32_t getNumBufferFrames() const { return mBufferSizeInFrames; }
//
// State
//
/**
* Initializes the audio stream as specified, but does not start the stream. Specifically,
* concrete subclasses should do whatever initialization and resource allocation required
* such that the stream can be started (in startStream()) as quickly as possible.
*
* The expectation is that this method will be synchronous in concrete subclasses.
*
* @param channelCount the number of channels in the audio data
* @param sampleRate the desired playback sample rate
* @param the device id of the device to route the audio to.
* @param a pointer to an AudioSource (subclass) object which will provide the audio data.
* @return ERROR_NONE if successful, otherwise an error code
*/
virtual Result setupStream(int32_t channelCount, int32_t sampleRate, int32_t routeDeviceId) = 0;
/**
* Deinitializes the stream.
* Concrete subclasses should stop the stream (is not already stopped) and deallocate any
* resources being used by the stream.
* The stream cannot be started again without another call to setupAudioStream().
*
* The expectation is that this method will be synchronous in concrete subclasses.
* @return ERROR_NONE if successful, otherwise an error code
*/
virtual Result teardownStream() = 0;
/**
* Begin the playback/recording process.
*
* In concrete subclasses, this may be either synchronous or asynchronous.
* @return ERROR_NONE if successful, otherwise an error code
*/
virtual Result startStream() = 0;
/**
* Stop the playback/recording process.
*
* In concrete subclasses, this may be either synchronous or asynchronous.
*/
virtual Result stopStream() = 0;
protected:
// Audio attributes
int32_t mChannelCount;
int32_t mSampleRate;
int32_t mRouteDeviceId;
int32_t mBufferSizeInFrames;
// from org.hyphonate.megaaudio.common.BuilderBase
static const int32_t SUB_TYPE_OBOE_AAUDIO = 0x0001;
static const int32_t SUB_TYPE_OBOE_OPENSL_ES = 0x0002;
};
#endif // MEGA_COMMON_STREAMBASE_H