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/Music.hpp>
00029 #include <SFML/Audio/OpenAL.hpp>
00030 #include <fstream>
00031 #include <iostream>
00032
00033
00037 sfMusic::sfMusic(std::size_t BufferSize) :
00038 myLoop (false),
00039 myDuration(0.f),
00040 mySamples (BufferSize)
00041 {
00042
00043 }
00044
00045
00049 bool sfMusic::Open(const std::string& Filename)
00050 {
00051
00052 myFilename = Filename;
00053
00054
00055 myFile = sf_private::sfSoundFile::Create(myFilename);
00056
00057
00058 std::size_t NbSamples;
00059 unsigned int ChannelsCount;
00060 unsigned int Frequency;
00061 if (!myFile->OpenRead(myFilename, NbSamples, ChannelsCount, Frequency))
00062 {
00063 std::cerr << "Failed to open \"" << myFilename << "\" for reading" << std::endl;
00064 return false;
00065 }
00066
00067
00068 myDuration = static_cast<float>(NbSamples) / Frequency;
00069
00070
00071 Initialize(ChannelsCount, Frequency);
00072
00073 return true;
00074 }
00075
00076
00080 void sfMusic::SetLoop(bool Loop)
00081 {
00082 myLoop = Loop;
00083 }
00084
00085
00089 bool sfMusic::GetLoop() const
00090 {
00091 return myLoop;
00092 }
00093
00094
00098 bool sfMusic::OnStart()
00099 {
00100
00101
00102 std::size_t NbSamples;
00103 unsigned int ChannelsCount;
00104 unsigned int Frequency;
00105
00106 return myFile->OpenRead(myFilename, NbSamples, ChannelsCount, Frequency);
00107 }
00108
00109
00113 bool sfMusic::OnGetData(sfSoundStream::Chunk& Data)
00114 {
00115
00116 Data.Samples = &mySamples[0];
00117 Data.NbSamples = myFile->Read(&mySamples[0], mySamples.size());
00118
00119
00120 if (Data.NbSamples < mySamples.size())
00121 {
00122
00123 if (myLoop)
00124 {
00125 if (OnStart())
00126 {
00127
00128 Data.NbSamples += myFile->Read(&mySamples[Data.NbSamples], mySamples.size() - Data.NbSamples);
00129 return true;
00130 }
00131 }
00132
00133
00134 return false;
00135 }
00136
00137
00138 return true;
00139 }
00140
00141
00145 float sfMusic::GetDuration() const
00146 {
00147 return myDuration;
00148 }