00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00026
00028 #include <SFML/Audio/SoundBuffer.hpp>
00029 #include <SFML/Audio/SoundFile.hpp>
00030 #include <SFML/Utilities/SharedPtr.hpp>
00031 #include <iostream>
00032
00033
00037 sfSoundBuffer::sfSoundBuffer() :
00038 myFrequency (0),
00039 myChannelsCount(0)
00040 {
00041
00042 }
00043
00044
00048 bool sfSoundBuffer::LoadFromFile(const std::string& Filename)
00049 {
00050
00051 sfSharedPtr<sf_private::sfSoundFile> File(sf_private::sfSoundFile::Create(Filename));
00052
00053
00054 std::size_t NbSamples = 0;
00055 if (File->OpenRead(Filename, NbSamples, myChannelsCount, myFrequency))
00056 {
00057
00058 mySamples.resize(NbSamples);
00059 if (File->Read(&mySamples[0], NbSamples) == NbSamples)
00060 {
00061
00062 myImpl = new sf_private::sfSoundBufferImpl(&mySamples[0], mySamples.size(), myChannelsCount, myFrequency);
00063
00064 return true;
00065 }
00066 else
00067 {
00068
00069 myImpl = NULL;
00070 std::cerr << "Failed to read audio data from file \"" << Filename << "\"" << std::endl;
00071
00072 return false;
00073 }
00074 }
00075 else
00076 {
00077
00078 myImpl = NULL;
00079 std::cerr << "Failed to load sound buffer from file \"" << Filename << "\"" << std::endl;
00080
00081 return false;
00082 }
00083 }
00084
00085
00089 bool sfSoundBuffer::LoadFromMemory(const sfInt16* Samples, std::size_t SamplesCount, unsigned int ChannelsCount, unsigned int Frequency)
00090 {
00091 if (Samples && SamplesCount && ChannelsCount && Frequency)
00092 {
00093
00094 mySamples.assign(Samples, Samples + SamplesCount);
00095 myChannelsCount = ChannelsCount;
00096 myFrequency = Frequency;
00097
00098
00099 myImpl = new sf_private::sfSoundBufferImpl(Samples, SamplesCount, ChannelsCount, Frequency);
00100
00101 return true;
00102 }
00103 else
00104 {
00105
00106 myImpl = NULL;
00107 std::cerr << "Failed to load sound buffer from memory ("
00108 << "Samples : " << Samples << ", "
00109 << "Samples count : " << SamplesCount << ", "
00110 << "Channels count : " << ChannelsCount << ", "
00111 << "Frequency : " << Frequency << ")"
00112 << std::endl;
00113
00114 return false;
00115 }
00116 }
00117
00118
00122 bool sfSoundBuffer::SaveToFile(const std::string& Filename) const
00123 {
00124
00125 sfSharedPtr<sf_private::sfSoundFile> File(sf_private::sfSoundFile::Create(Filename));
00126
00127
00128 std::size_t NbSamples = 0;
00129 if (File->OpenWrite(Filename, myChannelsCount, myFrequency))
00130 {
00131
00132 File->Write(&mySamples[0], mySamples.size());
00133
00134 return true;
00135 }
00136 else
00137 {
00138
00139 std::cerr << "Failed to save sound buffer to file \"" << Filename << "\"" << std::endl;
00140
00141 return false;
00142 }
00143 }
00144
00145
00149 bool sfSoundBuffer::IsEmpty() const
00150 {
00151 return mySamples.empty();
00152 }
00153
00154
00158 const std::vector<sfInt16>& sfSoundBuffer::GetSamples() const
00159 {
00160 return mySamples;
00161 }
00162
00163
00167 unsigned int sfSoundBuffer::GetFrequency() const
00168 {
00169 return myFrequency;
00170 }
00171
00172
00176 unsigned int sfSoundBuffer::GetChannelsCount() const
00177 {
00178 return myChannelsCount;
00179 }
00180
00181
00185 float sfSoundBuffer::GetDuration() const
00186 {
00187 if ((myFrequency == 0) || (myChannelsCount == 0))
00188 return 0;
00189 else
00190 return static_cast<float>(mySamples.size()) / myFrequency / myChannelsCount;
00191 }
00192
00193
00197 unsigned int sfSoundBuffer::GetId() const
00198 {
00199 return myImpl ? myImpl->Buffer : 0;
00200 }