Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2db119d authored by Glenn Kasten's avatar Glenn Kasten
Browse files

AudioBufferProvider comments and cleanup

Add comments about which methods implement the AudioBufferProvider interface.

Simplified the definition of kInvalidPts.  <stdint.h> is very hard to work
with, there seems to be no way to use it reliably to get INT64_MAX without
having a separate source file, which is ugly because it means kInvalidPts
is not a compile-time constant.  So I just deleted AudioBufferProvider.cpp
and used a hard-coded constant instead.

Added a default constructor for Buffer so that the fields aren't random
(especially .raw which is used to determine if the buffer is valid).

Make the pts for getNextBuffer default to kInvalidPTS so code that
doesn't need a pts doesn't have to specify a value.

Rename the parameter to AudioMixer::setBufferProvider to make it clearer.

Change-Id: I87e7290884d4ed975b019f62d1ab6ae2bc5065a5
parent be3835c6
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ LOCAL_SRC_FILES:= \
    AudioMixer.cpp.arm          \
    AudioResampler.cpp.arm      \
    AudioPolicyService.cpp      \
    AudioBufferProvider.cpp     \
    ServiceUtilities.cpp
#   AudioResamplerSinc.cpp.arm
#   AudioResamplerCubic.cpp.arm
+0 −28
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 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.
 */

#undef __STRICT_ANSI__
#define __STDINT_LIMITS
#define __STDC_LIMIT_MACROS
#include <stdint.h>

#include "AudioBufferProvider.h"

namespace android {

const int64_t AudioBufferProvider::kInvalidPTS = INT64_MAX;

}; // namespace android
+3 −4
Original line number Diff line number Diff line
@@ -17,8 +17,6 @@
#ifndef ANDROID_AUDIO_BUFFER_PROVIDER_H
#define ANDROID_AUDIO_BUFFER_PROVIDER_H

#include <stdint.h>
#include <sys/types.h>
#include <utils/Errors.h>

namespace android {
@@ -29,6 +27,7 @@ class AudioBufferProvider
public:

    struct Buffer {
        Buffer() : raw(NULL), frameCount(0) { }
        union {
            void*       raw;
            short*      i16;
@@ -40,12 +39,12 @@ public:
    virtual ~AudioBufferProvider() {}

    // value representing an invalid presentation timestamp
    static const int64_t kInvalidPTS;
    static const int64_t kInvalidPTS = 0x7FFFFFFFFFFFFFFFLL;    // <stdint.h> is too painful

    // pts is the local time when the next sample yielded by getNextBuffer
    // will be rendered.
    // Pass kInvalidPTS if the PTS is unknown or not applicable.
    virtual status_t getNextBuffer(Buffer* buffer, int64_t pts) = 0;
    virtual status_t getNextBuffer(Buffer* buffer, int64_t pts = kInvalidPTS) = 0;

    virtual void releaseBuffer(Buffer* buffer) = 0;
};
+11 −5
Original line number Diff line number Diff line
@@ -2891,8 +2891,7 @@ bool AudioFlinger::DirectOutputThread::threadLoop()
            // output audio to hardware
            while (frameCount) {
                buffer.frameCount = frameCount;
                activeTrack->getNextBuffer(&buffer,
                                           AudioBufferProvider::kInvalidPTS);
                activeTrack->getNextBuffer(&buffer);
                if (CC_UNLIKELY(buffer.raw == NULL)) {
                    memset(curBuf, 0, frameCount * mFrameSize);
                    break;
@@ -3398,11 +3397,14 @@ AudioFlinger::ThreadBase::TrackBase::~TrackBase()
    }
}

// AudioBufferProvider interface
// getNextBuffer() = 0;
// This implementation of releaseBuffer() is used by Track and RecordTrack, but not TimedTrack
void AudioFlinger::ThreadBase::TrackBase::releaseBuffer(AudioBufferProvider::Buffer* buffer)
{
    buffer->raw = NULL;
    mFrameCount = buffer->frameCount;
    step();
    (void) step();      // ignore return value of step()
    buffer->frameCount = 0;
}

@@ -3548,6 +3550,7 @@ void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size)
            (int)mAuxBuffer);
}

// AudioBufferProvider interface
status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(
    AudioBufferProvider::Buffer* buffer, int64_t pts)
{
@@ -4096,6 +4099,7 @@ void AudioFlinger::PlaybackThread::TimedTrack::timedYieldSilence(
    mTimedAudioOutputOnTime = false;
}

// AudioBufferProvider interface
void AudioFlinger::PlaybackThread::TimedTrack::releaseBuffer(
    AudioBufferProvider::Buffer* buffer) {

@@ -4181,6 +4185,7 @@ AudioFlinger::RecordThread::RecordTrack::~RecordTrack()
    }
}

// AudioBufferProvider interface
status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts)
{
    audio_track_cblk_t* cblk = this->cblk();
@@ -4868,8 +4873,7 @@ bool AudioFlinger::RecordThread::threadLoop()
            }

            buffer.frameCount = mFrameCount;
            if (CC_LIKELY(mActiveTrack->getNextBuffer(
                    &buffer, AudioBufferProvider::kInvalidPTS) == NO_ERROR)) {
            if (CC_LIKELY(mActiveTrack->getNextBuffer(&buffer) == NO_ERROR)) {
                size_t framesOut = buffer.frameCount;
                if (mResampler == NULL) {
                    // no resampling
@@ -5147,6 +5151,7 @@ status_t AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
    return NO_ERROR;
}

// AudioBufferProvider interface
status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts)
{
    size_t framesReq = buffer->frameCount;
@@ -5185,6 +5190,7 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer*
    return NO_ERROR;
}

// AudioBufferProvider interface
void AudioFlinger::RecordThread::releaseBuffer(AudioBufferProvider::Buffer* buffer)
{
    mRsmpInIndex += buffer->frameCount;
+15 −13
Original line number Diff line number Diff line
@@ -346,9 +346,8 @@ private:
                                TrackBase(const TrackBase&);
                                TrackBase& operator = (const TrackBase&);

            virtual status_t getNextBuffer(
                AudioBufferProvider::Buffer* buffer,
                int64_t pts) = 0;
            // AudioBufferProvider interface
            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts) = 0;
            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);

            audio_format_t format() const {
@@ -634,9 +633,10 @@ private:
                                Track(const Track&);
                                Track& operator = (const Track&);

            virtual status_t getNextBuffer(
                AudioBufferProvider::Buffer* buffer,
                int64_t pts);
            // AudioBufferProvider interface
            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts = kInvalidPTS);
            // releaseBuffer() not overridden

            virtual uint32_t framesReady() const;

            bool isMuted() const { return mMute; }
@@ -703,9 +703,10 @@ private:

            virtual uint32_t framesReady() const;

            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
                                           int64_t pts);
            // AudioBufferProvider interface
            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts);
            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);

            void timedYieldSamples(AudioBufferProvider::Buffer* buffer);
            void timedYieldSilence(uint32_t numFrames,
                                   AudioBufferProvider::Buffer* buffer);
@@ -1067,9 +1068,9 @@ private:
                                RecordTrack(const RecordTrack&);
                                RecordTrack& operator = (const RecordTrack&);

            virtual status_t getNextBuffer(
                AudioBufferProvider::Buffer* buffer,
                int64_t pts);
            // AudioBufferProvider interface
            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts = kInvalidPTS);
            // releaseBuffer() not overridden

            bool                mOverflow;
        };
@@ -1106,9 +1107,10 @@ private:
                AudioStreamIn* clearInput();
                virtual audio_stream_t* stream();

        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer,
                                          int64_t pts);
        // AudioBufferProvider interface
        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts);
        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);

        virtual bool        checkForNewParameters_l();
        virtual String8     getParameters(const String8& keys);
        virtual void        audioConfigChanged_l(int event, int param = 0);
Loading