AudioFormat_YM.cpp
Go to the documentation of this file.00001 //*** AudioFormat_YM.cpp *** 00002 00003 #include "AudioFormat_YM.h" 00004 #include "Debug.h" 00005 #include "Asset.h" 00006 #include "StandardLibrary.h" 00007 00008 #include "stsound/YmMusic.h" 00009 00010 //*** Register *** 00011 00012 void AudioFormat_YM::Register() 00013 { 00014 AudioFormat::RegisterAudioFormat(TestAsset,Create); 00015 } 00016 00017 00018 //*** Create *** 00019 00020 AudioFormat* AudioFormat_YM::Create(const Asset& asset) 00021 { 00022 return new AudioFormat_YM(asset); 00023 } 00024 00025 00026 //*** TestAsset *** 00027 00028 bool AudioFormat_YM::TestAsset(const Asset& asset) 00029 { 00030 if (asset.Open()) 00031 { 00032 char buffer[7]; 00033 asset.Read(buffer,7); 00034 asset.Close(); 00035 if (StrNCmp(&buffer[2],"-lh5-",5)==0 || StrNCmp(buffer,"YM3!",4)==0) 00036 { 00037 return true; 00038 } 00039 } 00040 00041 return false; 00042 } 00043 00044 00045 //*** Constructor *** 00046 00047 AudioFormat_YM::AudioFormat_YM(const Asset& asset): 00048 ymFile_(0), 00049 chunkStart_(0), 00050 chunkEnd_(0) 00051 { 00052 if (asset.Open()) 00053 { 00054 int size=asset.GetSize(); 00055 unsigned char* buffer=static_cast<unsigned char*>(Malloc(size)); 00056 asset.Read(buffer,size); 00057 asset.Close(); 00058 00059 ymFile_=new CYmMusic(); 00060 ymFile_->loadMemory(buffer,size); 00061 ymFile_->setLoopMode(true); 00062 ymFile_->play(); 00063 Free(buffer); 00064 } 00065 // Report missing file 00066 #ifdef _DEBUG 00067 else 00068 { 00069 const char* filename=asset.GetFilename().GetString(); 00070 if (filename) 00071 { 00072 char errorMessage[1024]; 00073 SNPrintF(errorMessage,1024,"File not found: %s",filename); 00074 Assert(false,errorMessage); 00075 } 00076 else 00077 { 00078 Assert(false,"An asset could not be accessed."); 00079 } 00080 } 00081 #endif 00082 } 00083 00084 00085 //*** Destructor *** 00086 00087 AudioFormat_YM::~AudioFormat_YM() 00088 { 00089 if (ymFile_) 00090 { 00091 ymFile_->unLoad(); 00092 delete ymFile_; 00093 } 00094 } 00095 00096 00097 //*** GetChannels *** 00098 00099 int AudioFormat_YM::GetChannels() 00100 { 00101 return 1; 00102 } 00103 00104 00105 //*** GetFrequency *** 00106 00107 int AudioFormat_YM::GetFrequency() 00108 { 00109 return 44100; 00110 } 00111 00112 00113 //*** GetBitsPerSample *** 00114 00115 int AudioFormat_YM::GetBitsPerSample() 00116 { 00117 return 16; 00118 } 00119 00120 00121 //*** GetSize *** 00122 00123 int AudioFormat_YM::GetSize() 00124 { 00125 if (!ymFile_) 00126 { 00127 return 0; 00128 } 00129 return (int)((ymFile_->getMusicTime()/1000.0f)*GetChannels()*(GetBitsPerSample()/8)*GetFrequency()); 00130 } 00131 00132 00133 //*** GetPosition *** 00134 00135 int AudioFormat_YM::GetPosition() 00136 { 00137 if (!ymFile_) 00138 { 00139 return 0; 00140 } 00141 return (int)((ymFile_->getPos()/1000.0f)*GetChannels()*(GetBitsPerSample()/8)*GetFrequency()); 00142 } 00143 00144 00145 //*** SetPosition *** 00146 00147 void AudioFormat_YM::SetPosition(int position) 00148 { 00149 if (!ymFile_) 00150 { 00151 return; 00152 } 00153 float sampleSize=(float)(GetChannels()*GetFrequency()*(GetBitsPerSample()/8)); 00154 float time=position/sampleSize; 00155 ymFile_->setMusicTime((int)(time*1000.0f)); 00156 } 00157 00158 00159 //*** CopySoundChunk *** 00160 00161 int AudioFormat_YM::CopySoundChunk(void* buffer,int bytes) 00162 { 00163 if (!ymFile_) 00164 { 00165 return 0; 00166 } 00167 chunkStart_=ymFile_->getCurrentFrame(); 00168 ymbool notdone=ymFile_->update(static_cast<ymsample*>(buffer),bytes/2); 00169 chunkEnd_=ymFile_->getCurrentFrame(); 00170 if (notdone) 00171 { 00172 return bytes; 00173 } 00174 00175 return bytes-1; 00176 } 00177 00178 00179 //*** GetRegisters *** 00180 00181 AudioFormat_YM::YmRegisters AudioFormat_YM::GetRegisters(float chunkPosition) 00182 { 00183 YmRegisters ym; 00184 MemSet(&ym,0,sizeof(ym)); 00185 if (!ymFile_) 00186 { 00187 return ym; 00188 } 00189 int ymFrame=(int)(chunkStart_+(chunkEnd_-chunkStart_)*chunkPosition); 00190 int savedFrame=ymFile_->getCurrentFrame(); 00191 ymFile_->setCurrentFrame(ymFrame); 00192 ymFile_->player(); 00193 ym.Channel_A_fine_tune=ymFile_->readYmRegister(0); 00194 ym.Channel_A_coarse_tune=ymFile_->readYmRegister(1); 00195 ym.Channel_B_fine_tune=ymFile_->readYmRegister(2); 00196 ym.Channel_B_coarse_tune=ymFile_->readYmRegister(3); 00197 ym.Channel_C_fine_tune=ymFile_->readYmRegister(4); 00198 ym.Channel_C_coarse_tune=ymFile_->readYmRegister(5); 00199 ym.Noise_generator_control=ymFile_->readYmRegister(6); 00200 ym.Mixer_control_IO_enable=ymFile_->readYmRegister(7); 00201 ym.Channel_A_amplitude=ymFile_->readYmRegister(8); 00202 ym.Channel_B_amplitude=ymFile_->readYmRegister(9); 00203 ym.Channel_C_amplitude=ymFile_->readYmRegister(10); 00204 ym.Envelope_period_fine_tune=ymFile_->readYmRegister(11); 00205 ym.Envelope_period_coarse_tune=ymFile_->readYmRegister(12); 00206 ym.Envelope_shape=ymFile_->readYmRegister(13); 00207 ymFile_->setCurrentFrame(savedFrame); 00208 return ym; 00209 } 00210
Reproduction/republishing of any material on this site without permission is strictly prohibited.
