/* * 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 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