C++程序  |  137行  |  3.29 KB

/*
 * Copyright (C) 2012 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 CTSAUDIO_BUFFER_H
#define CTSAUDIO_BUFFER_H

#include <stdlib.h>
#include <string.h>
#include <utils/String8.h>

#include <utils/RefBase.h>

#include <Log.h>

/**
 * Buffer passed for audio playback and recording
 * The buffer is supposed to be used with sp to guarantee that audio thread can
 * access it even if the client thread is dead.
 */
class Buffer: public virtual android::RefBase {
public:
    Buffer(size_t capacity, size_t size = 0, bool stereo = true);

    virtual ~Buffer();

    inline size_t getCapacity() {
        return mCapacity;
    };

    inline size_t getSize() {
        return mSize;
    };

    inline size_t getSamples() {
        return (getSize() / (isStereo() ? 4 : 2));
    };

    inline void setSize(size_t size) {
        mSize = size;
    };

    inline void increaseSize(size_t size) {
        mSize += size;
    }
    inline char* getData() {
        return mData;
    };

    inline void setData(char* data, size_t len) {
        ASSERT(len <= mCapacity);
        memcpy(mData, data, len);
        mSize = len;
    };

    inline char* getUnhanledData() {
        return mData + mHandled;
    };

    inline bool bufferHandled() {
        return mSize <= mHandled;
    };

    inline void restart() {
        mHandled = 0;
    };
    /// size was recorded
    inline void increaseHandled(size_t size) {
        mHandled += size;
    };

    inline void setHandled(size_t size) {
        mHandled = size;
    }
    /// amount recorded
    inline size_t amountHandled() {
        return mHandled;
    };

    inline size_t amountToHandle() {
        return mSize - mHandled;
    };

    inline bool isStereo() {
        return mStereo;
    };
    enum ConvertOption {
        EKeepCh0 = 0,
        EKeepCh1 = 1,
        EAverage = 2
    };
    /// change stereo buffer to mono
    void changeToMono(ConvertOption option);
    /// change mono buffer to stereo. This does not increase allocated memory.
    /// So it will fail if capacity is not big enough.
    bool changeToStereo();

    /// save the buffer to file
    /// extension appropriate for the data type will be appended to file name
    bool saveToFile(const android::String8& filename);

    bool operator ==(const Buffer& b) const;

    /// load raw data from given file.
    /// data format is decided by extension
    /// .r2s: 16 bps, stereo
    /// .r2m: 16bps, mono
    static Buffer* loadFromFile(const android::String8& filename);
private:
    // max data that can be hold
    size_t mCapacity;
    // data stored for playback / to store for recording
    size_t mSize;
    // how much data was handled / recorded
    size_t mHandled;
    // stereo or mono
    bool mStereo;
    // payload
    char* mData;
};



#endif // CTSAUDIO_BUFFER_H