diff --git a/src/minidexed.cpp b/src/minidexed.cpp index bc42586..ad23b4b 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -20,42 +20,50 @@ #include "minidexed.h" #include #include +#include LOGMODULE ("minidexed"); +CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt) +: CDexedAdapter (CConfig::MaxNotes, pConfig->GetSampleRate ()), + m_pConfig (pConfig), + m_UI (this, pConfig), + m_MIDIKeyboard (this, pConfig), + m_PCKeyboard (this), + m_SerialMIDI (this, pInterrupt, pConfig), + m_bUseSerial (false), + m_GetChunkTimer ("GetChunk", + 1000000U * pConfig->GetChunkSize ()/2 / pConfig->GetSampleRate ()), + m_bProfileEnabled (m_pConfig->GetProfileEnabled ()) +{ +}; + bool CMiniDexed::Initialize (void) { - if (!m_UI.Initialize ()) - { - return false; - } + if (!m_UI.Initialize ()) + { + return false; + } - m_SysExFileLoader.Load (); + m_SysExFileLoader.Load (); - if (m_SerialMIDI.Initialize ()) - { - LOGNOTE ("Serial MIDI interface enabled"); + if (m_SerialMIDI.Initialize ()) + { + LOGNOTE ("Serial MIDI interface enabled"); - m_bUseSerial = true; - } + m_bUseSerial = true; + } - activate(); + activate (); - ProgramChange (0); - setTranspose (24); + ProgramChange (0); + setTranspose (24); - return true; + return true; } -void CMiniDexed::Process(boolean bPlugAndPlayUpdated) +void CMiniDexed::Process (bool bPlugAndPlayUpdated) { - if (m_pConfig->GetProfileEnabled ()) - { - m_GetChunkTimer.Dump (); - } - - m_UI.Process (); - m_MIDIKeyboard.Process (bPlugAndPlayUpdated); m_PCKeyboard.Process (bPlugAndPlayUpdated); @@ -64,6 +72,13 @@ void CMiniDexed::Process(boolean bPlugAndPlayUpdated) { m_SerialMIDI.Process (); } + + m_UI.Process (); + + if (m_bProfileEnabled) + { + m_GetChunkTimer.Dump (); + } } void CMiniDexed::BankSelectLSB (unsigned nBankLSB) @@ -79,126 +94,171 @@ void CMiniDexed::BankSelectLSB (unsigned nBankLSB) m_SysExFileLoader.SelectVoiceBank (nBankLSB); } -void CMiniDexed::ProgramChange (unsigned program) +void CMiniDexed::ProgramChange (unsigned nProgram) { - if (program > 31) + if (nProgram > 31) { return; } uint8_t Buffer[156]; - m_SysExFileLoader.GetVoice (program, Buffer); + m_SysExFileLoader.GetVoice (nProgram, Buffer); loadVoiceParameters (Buffer); - m_UI.ProgramChanged (program); + m_UI.ProgramChanged (nProgram); +} + +//// PWM ////////////////////////////////////////////////////////////////////// + +CMiniDexedPWM::CMiniDexedPWM (CConfig *pConfig, CInterruptSystem *pInterrupt) +: CMiniDexed (pConfig, pInterrupt), + CPWMSoundBaseDevice (pInterrupt, pConfig->GetSampleRate (), + pConfig->GetChunkSize ()) +{ } bool CMiniDexedPWM::Initialize (void) { - if (!CMiniDexed::Initialize()) - { - return false; - } + if (!CMiniDexed::Initialize ()) + { + return false; + } - return Start (); + return Start (); } -unsigned CMiniDexedPWM::GetChunk(u32 *pBuffer, unsigned nChunkSize) +unsigned CMiniDexedPWM::GetChunk (u32 *pBuffer, unsigned nChunkSize) { - m_GetChunkTimer.Start(); - - unsigned nResult = nChunkSize; + if (m_bProfileEnabled) + { + m_GetChunkTimer.Start (); + } - int16_t int16_buf[nChunkSize/2]; + unsigned nResult = nChunkSize; - getSamples(nChunkSize/2, int16_buf); + int16_t SampleBuffer[nChunkSize/2]; + getSamples (nChunkSize/2, SampleBuffer); - for (unsigned i = 0; nChunkSize > 0; nChunkSize -= 2) // fill the whole buffer - { - s32 nSample = int16_buf[i++]; - nSample += 32768; - nSample *= GetRangeMax()/2; - nSample /= 32768; + for (unsigned i = 0; nChunkSize > 0; nChunkSize -= 2) // fill the whole buffer + { + s32 nSample = SampleBuffer[i++]; + nSample += 32768; + nSample *= GetRangeMax()/2; + nSample /= 32768; - *pBuffer++ = nSample; // 2 stereo channels - *pBuffer++ = nSample; - } + *pBuffer++ = nSample; // 2 stereo channels + *pBuffer++ = nSample; + } - m_GetChunkTimer.Stop(); + if (m_bProfileEnabled) + { + m_GetChunkTimer.Stop (); + } - return(nResult); + return nResult; }; +//// I2S ////////////////////////////////////////////////////////////////////// + +CMiniDexedI2S::CMiniDexedI2S (CConfig *pConfig, CInterruptSystem *pInterrupt, + CI2CMaster *pI2CMaster) +: CMiniDexed (pConfig, pInterrupt), + CI2SSoundBaseDevice (pInterrupt, pConfig->GetSampleRate (), + pConfig->GetChunkSize (), false, pI2CMaster, + pConfig->GetDACI2CAddress ()) +{ +} + bool CMiniDexedI2S::Initialize (void) { - if (!CMiniDexed::Initialize()) - { - return false; - } + if (!CMiniDexed::Initialize ()) + { + return false; + } - return Start (); + return Start (); } -unsigned CMiniDexedI2S::GetChunk(u32 *pBuffer, unsigned nChunkSize) +unsigned CMiniDexedI2S::GetChunk (u32 *pBuffer, unsigned nChunkSize) { - m_GetChunkTimer.Start(); - - unsigned nResult = nChunkSize; + if (m_bProfileEnabled) + { + m_GetChunkTimer.Start (); + } - int16_t int16_buf[nChunkSize/2]; + unsigned nResult = nChunkSize; - getSamples(nChunkSize/2, int16_buf); + int16_t SampleBuffer[nChunkSize/2]; + getSamples (nChunkSize/2, SampleBuffer); - for (unsigned i = 0; nChunkSize > 0; nChunkSize -= 2) // fill the whole buffer - { - s32 nSample = int16_buf[i++]; - nSample <<= 8; + for (unsigned i = 0; nChunkSize > 0; nChunkSize -= 2) // fill the whole buffer + { + s32 nSample = SampleBuffer[i++]; + nSample <<= 8; - *pBuffer++ = nSample; // 2 stereo channels - *pBuffer++ = nSample; - } + *pBuffer++ = nSample; // 2 stereo channels + *pBuffer++ = nSample; + } - m_GetChunkTimer.Stop(); + if (m_bProfileEnabled) + { + m_GetChunkTimer.Stop (); + } - return(nResult); + return nResult; }; +//// HDMI ///////////////////////////////////////////////////////////////////// + +CMiniDexedHDMI::CMiniDexedHDMI (CConfig *pConfig, CInterruptSystem *pInterrupt) +: CMiniDexed (pConfig, pInterrupt), + CHDMISoundBaseDevice (pInterrupt, pConfig->GetSampleRate (), + pConfig->GetChunkSize ()) +{ +} + bool CMiniDexedHDMI::Initialize (void) { - if (!CMiniDexed::Initialize()) - { - return false; - } + if (!CMiniDexed::Initialize ()) + { + return false; + } - return Start (); + return Start (); } unsigned CMiniDexedHDMI::GetChunk(u32 *pBuffer, unsigned nChunkSize) { - m_GetChunkTimer.Start(); - - unsigned nResult = nChunkSize; - - int16_t int16_buf[nChunkSize/2]; - unsigned nFrame = 0; + if (m_bProfileEnabled) + { + m_GetChunkTimer.Start (); + } - getSamples(nChunkSize/2, int16_buf); + unsigned nResult = nChunkSize; - for (unsigned i = 0; nChunkSize > 0; nChunkSize -= 2) // fill the whole buffer - { - s32 nSample = int16_buf[i++]; - nSample <<= 8; + int16_t SampleBuffer[nChunkSize/2]; + getSamples (nChunkSize/2, SampleBuffer); - nSample = ConvertIEC958Sample (nSample, nFrame); + unsigned nFrame = 0; + for (unsigned i = 0; nChunkSize > 0; nChunkSize -= 2) // fill the whole buffer + { + s32 nSample = SampleBuffer[i++]; + nSample <<= 8; - if (++nFrame == IEC958_FRAMES_PER_BLOCK) - nFrame = 0; + nSample = ConvertIEC958Sample (nSample, nFrame); + if (++nFrame == IEC958_FRAMES_PER_BLOCK) + { + nFrame = 0; + } - *pBuffer++ = nSample; // 2 stereo channels - *pBuffer++ = nSample; - } + *pBuffer++ = nSample; // 2 stereo channels + *pBuffer++ = nSample; + } - m_GetChunkTimer.Stop(); + if (m_bProfileEnabled) + { + m_GetChunkTimer.Stop(); + } - return(nResult); + return nResult; }; diff --git a/src/minidexed.h b/src/minidexed.h index 463cde0..779262d 100644 --- a/src/minidexed.h +++ b/src/minidexed.h @@ -21,94 +21,84 @@ #define _minidexed_h #include "dexedadapter.h" -#include -#include -#include -#include -#include -#include -#include -#include #include "config.h" +#include "userinterface.h" #include "sysexfileloader.h" #include "midikeyboard.h" #include "pckeyboard.h" #include "serialmididevice.h" #include "perftimer.h" -#include "userinterface.h" +#include +#include +#include +#include +#include +#include +#include class CMiniDexed : public CDexedAdapter { - public: - CMiniDexed(CConfig *pConfig, CInterruptSystem *pInterrupt) -: CDexedAdapter (CConfig::MaxNotes, pConfig->GetSampleRate ()), - m_MIDIKeyboard (this, pConfig), - m_PCKeyboard (this), - m_SerialMIDI (this, pInterrupt, pConfig), - m_bUseSerial (FALSE), - m_pConfig (pConfig), - m_UI (this, pConfig), - m_GetChunkTimer ("GetChunk", 1000000U * pConfig->GetChunkSize ()/2 / pConfig->GetSampleRate ()) - { - }; - - virtual bool Initialize (void); - void Process(boolean bPlugAndPlayUpdated); - - void BankSelectLSB (unsigned nBankLSB); - void ProgramChange (unsigned program); - - private: - CMIDIKeyboard m_MIDIKeyboard; - CPCKeyboard m_PCKeyboard; - CSerialMIDIDevice m_SerialMIDI; - boolean m_bUseSerial; - CSysExFileLoader m_SysExFileLoader; - CConfig *m_pConfig; - CUserInterface m_UI; - - protected: - CPerformanceTimer m_GetChunkTimer; +public: + CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt); + + virtual bool Initialize (void); + + void Process (bool bPlugAndPlayUpdated); + + void BankSelectLSB (unsigned nBankLSB); + void ProgramChange (unsigned nProgram); + +private: + CConfig *m_pConfig; + + CUserInterface m_UI; + CSysExFileLoader m_SysExFileLoader; + + CMIDIKeyboard m_MIDIKeyboard; + CPCKeyboard m_PCKeyboard; + CSerialMIDIDevice m_SerialMIDI; + bool m_bUseSerial; + +protected: + CPerformanceTimer m_GetChunkTimer; + bool m_bProfileEnabled; }; +//// PWM ////////////////////////////////////////////////////////////////////// + class CMiniDexedPWM : public CMiniDexed, public CPWMSoundBaseDevice { - public: - CMiniDexedPWM(CConfig *pConfig, CInterruptSystem *pInterrupt) -: CMiniDexed(pConfig, pInterrupt), - CPWMSoundBaseDevice (pInterrupt, pConfig->GetSampleRate (), pConfig->GetChunkSize ()) - { - } - - bool Initialize (void); - unsigned GetChunk (u32 *pBuffer, unsigned nChunkSize); +public: + CMiniDexedPWM (CConfig *pConfig, CInterruptSystem *pInterrupt); + + bool Initialize (void); + + unsigned GetChunk (u32 *pBuffer, unsigned nChunkSize); }; +//// I2S ////////////////////////////////////////////////////////////////////// + class CMiniDexedI2S : public CMiniDexed, public CI2SSoundBaseDevice { - public: - CMiniDexedI2S(CConfig *pConfig, CInterruptSystem *pInterrupt, CI2CMaster *pI2CMaster) -: CMiniDexed(pConfig, pInterrupt), - CI2SSoundBaseDevice (pInterrupt, pConfig->GetSampleRate (), pConfig->GetChunkSize (), - FALSE, pI2CMaster, pConfig->GetDACI2CAddress ()) - { - } - - bool Initialize (void); - unsigned GetChunk (u32 *pBuffer, unsigned nChunkSize); +public: + CMiniDexedI2S (CConfig *pConfig, CInterruptSystem *pInterrupt, + CI2CMaster *pI2CMaster); + + bool Initialize (void); + + unsigned GetChunk (u32 *pBuffer, unsigned nChunkSize); }; +//// HDMI ///////////////////////////////////////////////////////////////////// + class CMiniDexedHDMI : public CMiniDexed, public CHDMISoundBaseDevice { - public: - CMiniDexedHDMI(CConfig *pConfig, CInterruptSystem *pInterrupt) -: CMiniDexed(pConfig, pInterrupt), - CHDMISoundBaseDevice (pInterrupt, pConfig->GetSampleRate (), pConfig->GetChunkSize ()) - { - } - - bool Initialize (void); - unsigned GetChunk (u32 *pBuffer, unsigned nChunkSize); +public: + CMiniDexedHDMI (CConfig *pConfig, CInterruptSystem *pInterrupt); + + bool Initialize (void); + + unsigned GetChunk (u32 *pBuffer, unsigned nChunkSize); }; #endif