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/AudioDevice.hpp>
00029 #include <SFML/Audio/AudioResource.hpp>
00030 #include <algorithm>
00031 #include <iostream>
00032
00033
00034 namespace sf
00035 {
00036 namespace priv
00037 {
00039
00041 AudioDevice* AudioDevice::ourInstance;
00042
00043
00047 AudioDevice::AudioDevice() :
00048 myRefCount(0)
00049 {
00050
00051 myDevice = alcOpenDevice(NULL);
00052
00053 if (myDevice)
00054 {
00055
00056 myContext = alcCreateContext(myDevice, NULL);
00057
00058 if (myContext)
00059 {
00060
00061 alcMakeContextCurrent(myContext);
00062
00063
00064 float ListenerPos[] = {0.f, 0.f, 0.f};
00065 float ListenerVel[] = {0.f, 0.f, 0.f};
00066 float ListenerOri[] = {0.f, 0.f, 0.f, 0.f, 1.f, 0.f};
00067 ALCheck(alListenerfv(AL_POSITION, ListenerPos));
00068 ALCheck(alListenerfv(AL_VELOCITY, ListenerVel));
00069 ALCheck(alListenerfv(AL_ORIENTATION, ListenerOri));
00070 }
00071 else
00072 {
00073 std::cerr << "Failed to create audio context" << std::endl;
00074 }
00075 }
00076 else
00077 {
00078 std::cerr << "Failed to open audio device" << std::endl;
00079 }
00080 }
00081
00082
00086 AudioDevice::~AudioDevice()
00087 {
00088
00089 alcMakeContextCurrent(NULL);
00090 if (myContext)
00091 alcDestroyContext(myContext);
00092
00093
00094 if (myDevice)
00095 alcCloseDevice(myDevice);
00096 }
00097
00098
00102 AudioDevice& AudioDevice::GetInstance()
00103 {
00104
00105 if (!ourInstance)
00106 ourInstance = new AudioDevice;
00107
00108 return *ourInstance;
00109 }
00110
00111
00115 void AudioDevice::AddReference()
00116 {
00117
00118 if (!ourInstance)
00119 ourInstance = new AudioDevice;
00120
00121
00122 ourInstance->myRefCount++;
00123 }
00124
00125
00129 void AudioDevice::RemoveReference()
00130 {
00131
00132 ourInstance->myRefCount--;
00133
00134
00135 if (ourInstance->myRefCount == 0)
00136 {
00137 delete ourInstance;
00138 ourInstance = NULL;
00139 }
00140 }
00141
00142
00146 ALCdevice* AudioDevice::GetDevice() const
00147 {
00148 return myDevice;
00149 }
00150
00151
00155 ALenum AudioDevice::GetFormatFromChannelsCount(unsigned int ChannelsCount) const
00156 {
00157
00158 switch (ChannelsCount)
00159 {
00160 case 1 : return AL_FORMAT_MONO16;
00161 case 2 : return AL_FORMAT_STEREO16;
00162 case 4 : return alGetEnumValue("AL_FORMAT_QUAD16");
00163 case 6 : return alGetEnumValue("AL_FORMAT_51CHN16");
00164 case 7 : return alGetEnumValue("AL_FORMAT_61CHN16");
00165 case 8 : return alGetEnumValue("AL_FORMAT_71CHN16");
00166 }
00167
00168 return 0;
00169 }
00170
00171 }
00172
00173 }