00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "buffer.h"
00021 #include "engine.h"
00022 #include "soundreader.h"
00023
00024 using namespace GluonAudio;
00025
00026 class Buffer::BufferPrivate
00027 {
00028 public:
00029 BufferPrivate()
00030 {
00031 buffer = 0;
00032 shared = false;
00033 }
00034 ~BufferPrivate();
00035
00036 ALuint buffer;
00037 bool shared;
00038 };
00039
00040 Buffer::BufferPrivate::~BufferPrivate()
00041 {
00042 if( buffer && !shared )
00043 alDeleteBuffers( 1, &buffer );
00044 }
00045
00046 Buffer::Buffer()
00047 : d( new BufferPrivate )
00048 {
00049 init();
00050 }
00051
00052 Buffer::Buffer( const QString& fileName )
00053 : d( new BufferPrivate )
00054
00055 {
00056 setBuffer( fileName );
00057 init();
00058 }
00059
00060 Buffer::Buffer( ALuint buffer )
00061 : d( new BufferPrivate )
00062 {
00063 d->buffer = buffer;
00064 init();
00065 }
00066
00067 Buffer::Buffer( const GluonAudio::Buffer& other )
00068 : d( other.d )
00069 {
00070
00071 }
00072
00073 Buffer::~Buffer()
00074 {
00075 }
00076
00077 void Buffer::setBuffer( ALuint buffer, bool shared )
00078 {
00079 d->buffer = buffer;
00080 d->shared = shared;
00081 }
00082
00083 bool Buffer::isEmpty()const
00084 {
00085 return !d->buffer;
00086 }
00087
00088 void Buffer::init()
00089 {
00090 }
00091
00092 ALuint Buffer::buffer() const
00093 {
00094 return d->buffer;
00095 }
00096
00097 void Buffer::setBuffer( const QString& fileName )
00098 {
00099 SoundReader reader( fileName );
00100 if( reader.canRead() )
00101 {
00102 d->buffer = reader.alBuffer();
00103 }
00104 }
00105
00106 ALfloat Buffer::duration() const
00107 {
00108 ALint size = 0.f;
00109 ALint bits = 0.f;
00110 ALint channels = 0.f;
00111 ALint frequency = 0.f;
00112
00113 alGetBufferi( d->buffer, AL_SIZE, &size );
00114 alGetBufferi( d->buffer, AL_BITS, &bits );
00115 alGetBufferi( d->buffer, AL_CHANNELS, &channels );
00116 alGetBufferi( d->buffer, AL_FREQUENCY, &frequency );
00117
00118 ALfloat sample = size / channels * 8 / bits;
00119 ALfloat dur = ( float )sample / frequency;
00120
00121
00122
00123
00124
00125 return dur;
00126 }