AudioBufferProvider.h revision 47f3f5a119194d4c06815453be9950ba112c8e3e
1496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer/*
284ba14f6d016ab181f1fd5de8050e1b9bbc83904Mikhail Glushenkov * Copyright (C) 2007 The Android Open Source Project
3496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer *
4496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer * Licensed under the Apache License, Version 2.0 (the "License");
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner * you may not use this file except in compliance with the License.
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner * You may obtain a copy of the License at
784ba14f6d016ab181f1fd5de8050e1b9bbc83904Mikhail Glushenkov *
8496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer *      http://www.apache.org/licenses/LICENSE-2.0
9496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer *
10496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer * Unless required by applicable law or agreed to in writing, software
11496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer * distributed under the License is distributed on an "AS IS" BASIS,
12496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer * See the License for the specific language governing permissions and
1490b54138834a057179c7a02931217ab5a82ed389Reid Spencer * limitations under the License.
15ced4110f5b068b9b64e3a55a9ee57b621ce4acb1Reid Spencer */
1690b54138834a057179c7a02931217ab5a82ed389Reid Spencer
1748fe63526e35ddaee7e98879596a569911f41319Sebastian Redl#ifndef ANDROID_AUDIO_BUFFER_PROVIDER_H
1890b54138834a057179c7a02931217ab5a82ed389Reid Spencer#define ANDROID_AUDIO_BUFFER_PROVIDER_H
1923a1cf3e085325783ef2e4078308f913cba5012eJeff Cohen
2048fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer#include <utils/Errors.h>
21f6cbc0fd6494e50c48ebe4b5eecde1c70bcd5165Reid Spencer
2248fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencernamespace android {
23f6cbc0fd6494e50c48ebe4b5eecde1c70bcd5165Reid Spencer// ----------------------------------------------------------------------------
24f6cbc0fd6494e50c48ebe4b5eecde1c70bcd5165Reid Spencer
2590b54138834a057179c7a02931217ab5a82ed389Reid Spencerclass AudioBufferProvider
2648fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer{
2748fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencerpublic:
2848fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer
2948fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer    // FIXME merge with AudioTrackShared::Buffer, AudioTrack::Buffer, and AudioRecord::Buffer
3048fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer    //       and rename getNextBuffer() to obtainBuffer()
3148fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer    struct Buffer {
3248fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer        Buffer() : raw(NULL), frameCount(0) { }
3348fdf91d0f17b19bb7345156b928689df94d0c6cReid Spencer        union {
3490b54138834a057179c7a02931217ab5a82ed389Reid Spencer            void*       raw;
3590b54138834a057179c7a02931217ab5a82ed389Reid Spencer            short*      i16;
3690b54138834a057179c7a02931217ab5a82ed389Reid Spencer            int8_t*     i8;
3790b54138834a057179c7a02931217ab5a82ed389Reid Spencer        };
3890b54138834a057179c7a02931217ab5a82ed389Reid Spencer        size_t frameCount;
39ee841a1a8735805f84d609ae105bec92525033c6Jeff Cohen    };
40ee841a1a8735805f84d609ae105bec92525033c6Jeff Cohen
41ee841a1a8735805f84d609ae105bec92525033c6Jeff Cohen    virtual ~AudioBufferProvider() {}
42ced4110f5b068b9b64e3a55a9ee57b621ce4acb1Reid Spencer
4335033a5876aa27ea5729bc29b41bb4460a303cadChris Lattner    // value representing an invalid presentation timestamp
4490b54138834a057179c7a02931217ab5a82ed389Reid Spencer    static const int64_t kInvalidPTS = 0x7FFFFFFFFFFFFFFFLL;    // <stdint.h> is too painful
457b60a15abc155196d9515a1e242ec0137afff753Reid Spencer
46df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    // pts is the local time when the next sample yielded by getNextBuffer
477b60a15abc155196d9515a1e242ec0137afff753Reid Spencer    // will be rendered.
48298d6c14ca1936677aaf6cca3efc569b6e53d294Reid Spencer    // Pass kInvalidPTS if the PTS is unknown or not applicable.
49298d6c14ca1936677aaf6cca3efc569b6e53d294Reid Spencer    // On entry:
50298d6c14ca1936677aaf6cca3efc569b6e53d294Reid Spencer    //  buffer              != NULL
51298d6c14ca1936677aaf6cca3efc569b6e53d294Reid Spencer    //  buffer->raw         unused
5290b54138834a057179c7a02931217ab5a82ed389Reid Spencer    //  buffer->frameCount  maximum number of desired frames
5390b54138834a057179c7a02931217ab5a82ed389Reid Spencer    // On successful return:
54496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer    //  status              NO_ERROR
55496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer    //  buffer->raw         non-NULL pointer to buffer->frameCount contiguous available frames
56496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer    //  buffer->frameCount  number of contiguous available frames at buffer->raw,
5784ba14f6d016ab181f1fd5de8050e1b9bbc83904Mikhail Glushenkov    //                      0 < buffer->frameCount <= entry value
5890b54138834a057179c7a02931217ab5a82ed389Reid Spencer    // On error return:
59496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer    //  status              != NO_ERROR
60496c277a6d161413e3f6976c9991ddccd8ecae8aReid Spencer    //  buffer->raw         NULL
613be2d12bdec9ec3a244aae695d3b586ac27dcfdeDaniel Dunbar    //  buffer->frameCount  0
62df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    virtual status_t getNextBuffer(Buffer* buffer, int64_t pts = kInvalidPTS) = 0;
63df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar
64df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    // Release (a portion of) the buffer previously obtained by getNextBuffer().
65df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    // It is permissible to call releaseBuffer() multiple times per getNextBuffer().
66df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    // On entry:
67df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //  buffer->frameCount  number of frames to release, must be <= number of frames
68df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //                      obtained but not yet released
69df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //  buffer->raw         unused
70df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    // On return:
71df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //  buffer->frameCount  0; implementation MUST set to zero
72df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //  buffer->raw         undefined; implementation is PERMITTED to set to any value,
73df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //                      so if caller needs to continue using this buffer it must
74df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    //                      keep track of the pointer itself
75df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar    virtual void releaseBuffer(Buffer* buffer) = 0;
76df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar};
77df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar
78df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar// ----------------------------------------------------------------------------
79df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar}; // namespace android
80df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar
81df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar#endif // ANDROID_AUDIO_BUFFER_PROVIDER_H
82df3388492bc2bfc73b3e0195693e2f67f10dcf52Daniel Dunbar