00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 class pgSndDaemon;
00033
00034
00039 class PG_API pgSndMgr
00040 {
00041 friend class pgSndDaemon;
00042
00043 public:
00044 pgDefineException(ExceptionInvalidArgument);
00045 pgDefineException(ExceptionInvalidCall);
00046 pgDefineException(ExceptionInvalidType);
00047 pgDefineException(ExceptionNotFound);
00048 pgDefineException(ExceptionNotInitialized);
00049 pgDefineException(ExceptionWaveInitializerFailed);
00050
00051 static const u32 TRACK_NUM = 4;
00052
00053 enum ChannelNum
00054 {
00055 CHANNEL_NUM_MONO = 1,
00056 CHANNEL_NUM_STEREO = 2
00057 };
00058
00059 enum SampleRate
00060 {
00061 SAMPLE_RATE_11KHZ = 11025,
00062 SAMPLE_RATE_22KHZ = 22050,
00063 SAMPLE_RATE_44KHZ = 44100
00064 };
00065
00066 static bool isCreated();
00067 static void createAfterRes();
00068 static void destroyBeforeRes();
00069
00070 static bool isSoundDeviceOpen();
00071 static bool openSoundDevice(ChannelNum channel_num, SampleRate sample_rate, u16 snd_mix_buf_msec);
00072 static void closeSoundDevice();
00073
00074 static ChannelNum getSoundDeviceChannelNum();
00075 static SampleRate getSoundDeviceSampleRate();
00076 static u16 getSoundMixBufferMsec();
00077
00078 static ChannelNum getChannelNum(pgID snd_id);
00079 static SampleRate getSampleRate(pgID snd_id);
00080 static u32 getSampleNum(pgID snd_id);
00081
00082 static u8 getTrackVolume(u8 trk_no);
00083 static void setTrackVolume(u8 trk_no, u8 trk_vol);
00084 static void fadeTrackVolume(u8 trk_no, u8 to_trk_vol, r32 delta_per_frame);
00085
00086 static bool isPlaying(u8 trk_no);
00087 static void play(u8 trk_no, pgID snd_id, u8 snd_vol, bool is_play_loop, u32 play_pos = 0);
00088 static void stop(u8 trk_no);
00089
00090 static pgID getPlayingSoundID(u8 trk_no);
00091 static u8 getPlayingSoundVolume(u8 trk_no);
00092 static bool isPlayingLoop(u8 trk_no);
00093 static u32 getPlayingPosition(u8 trk_no);
00094
00095 private:
00096 enum TrackState
00097 {
00098 STATE_STOP,
00099 STATE_PLAY_ONESHOT,
00100 STATE_PLAY_LOOP
00101 };
00102
00103 struct SoundInfo
00104 {
00105 pgType<u8, ChannelNum> channel_num;
00106 pgType<u16, SampleRate> sample_rate;
00107 const void* data;
00108 u32 data_size;
00109 u32 sample_num;
00110 };
00111
00112 struct TrackInfo
00113 {
00114 pgType<u8, TrackState> trk_state;
00115 r32 trk_vol;
00116 pgID snd_id;
00117 u8 snd_vol;
00118 const SoundInfo* snd_info;
00119 u32 play_pos;
00120 u8 fade_to_trk_vol;
00121 u32 fade_frame_count;
00122 r32 fade_delta_per_frame;
00123 };
00124
00125 pgSndMgr();
00126 ~pgSndMgr();
00127 void operator=(const pgSndMgr&);
00128
00129 static pgSndMgr* instance();
00130
00131 static bool soundMixFunction(void* snd_mix_buf);
00132
00133 static void waveInitializer(pgID id, pgStr<char, 3> ext, const void* data, u32 data_size, void** exinfo);
00134 static void waveFinalizer(pgID id, pgStr<char, 3> ext, const void* data, u32 data_size, void* exinfo);
00135
00136 TrackInfo m_trk_info[TRACK_NUM];
00137 pgSndDaemon* m_snd_daemon;
00138
00139 static pgSndMgr* m_instance;
00140 };