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 <SFML/Audio/SoundFile.hpp>
00031 #include <fstream>
00032 #include <iostream>
00033
00034
00038 sfMusic::sfMusic(std::size_t BufferSize) :
00039 myFile (NULL),
00040 myLoop (false),
00041 myDuration(0.f),
00042 mySamples (BufferSize)
00043 {
00044
00045 }
00046
00047
00051 sfMusic::~sfMusic()
00052 {
00053 delete myFile;
00054 }
00055
00056
00060 bool sfMusic::Open(const std::string& Filename)
00061 {
00062
00063 myFilename = Filename;
00064
00065
00066 delete myFile;
00067 myFile = sf_private::sfSoundFile::Create(myFilename);
00068
00069
00070 std::size_t NbSamples;
00071 unsigned int ChannelsCount;
00072 unsigned int Frequency;
00073 if (!myFile->OpenRead(myFilename, NbSamples, ChannelsCount, Frequency))
00074 {
00075 std::cerr << "Failed to open \"" << myFilename << "\" for reading" << std::endl;
00076 return false;
00077 }
00078
00079
00080 myDuration = static_cast<float>(NbSamples) / Frequency;
00081
00082
00083 Initialize(ChannelsCount, Frequency);
00084
00085 return true;
00086 }
00087
00088
00092 void sfMusic::SetLoop(bool Loop)
00093 {
00094 myLoop = Loop;
00095 }
00096
00097
00101 bool sfMusic::GetLoop() const
00102 {
00103 return myLoop;
00104 }
00105
00106
00110 bool sfMusic::OnStart()
00111 {
00112
00113
00114 std::size_t NbSamples;
00115 unsigned int ChannelsCount;
00116 unsigned int Frequency;
00117
00118 return myFile->OpenRead(myFilename, NbSamples, ChannelsCount, Frequency);
00119 }
00120
00121
00125 bool sfMusic::OnGetData(sfSoundStream::Chunk& Data)
00126 {
00127
00128 Data.Samples = &mySamples[0];
00129 Data.NbSamples = myFile->Read(&mySamples[0], mySamples.size());
00130
00131
00132 if (Data.NbSamples < mySamples.size())
00133 {
00134
00135 if (myLoop)
00136 {
00137 if (OnStart())
00138 {
00139
00140 Data.NbSamples += myFile->Read(&mySamples[Data.NbSamples], mySamples.size() - Data.NbSamples);
00141 return true;
00142 }
00143 }
00144
00145
00146 return false;
00147 }
00148
00149
00150 return true;
00151 }
00152
00153
00157 float sfMusic::GetDuration() const
00158 {
00159 return myDuration;
00160 }