OSDN Git Service

[VM] Add PC-8001/mk2/8801/mk2.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pcm1bit.cpp
index 57f269b..645aa34 100644 (file)
 
 void PCM1BIT::initialize()
 {
+       DEVICE::initialize();
        signal = false;
        on = true;
        mute = false;
+       realtime = false;
        changed = 0;
        last_vol_l = last_vol_r = 0;
        
@@ -22,29 +24,34 @@ void PCM1BIT::initialize()
 
 void PCM1BIT::reset()
 {
-       prev_clock = current_clock();
+       prev_clock = get_current_clock();
        positive_clocks = negative_clocks = 0;
 }
 
-void PCM1BIT::write_signal(int id, uint32 data, uint32 mask)
+void PCM1BIT::write_signal(int id, uint32_t data, uint32_t mask)
 {
        if(id == SIG_PCM1BIT_SIGNAL) {
                bool next = ((data & mask) != 0);
                if(signal != next) {
+                       touch_sound();
                        if(signal) {
-                               positive_clocks += passed_clock(prev_clock);
+                               positive_clocks += get_passed_clock(prev_clock);
                        } else {
-                               negative_clocks += passed_clock(prev_clock);
+                               negative_clocks += get_passed_clock(prev_clock);
                        }
-                       prev_clock = current_clock();
+                       prev_clock = get_current_clock();
                        // mute if signal is not changed in 2 frames
                        changed = 2;
                        signal = next;
                }
        } else if(id == SIG_PCM1BIT_ON) {
+               touch_sound();
                on = ((data & mask) != 0);
+               set_realtime_render(this, on & !mute);
        } else if(id == SIG_PCM1BIT_MUTE) {
+               touch_sound();
                mute = ((data & mask) != 0);
+               set_realtime_render(this, on & !mute);
        }
 }
 
@@ -55,13 +62,13 @@ void PCM1BIT::event_frame()
        }
 }
 
-void PCM1BIT::mix(int32* buffer, int cnt)
+void PCM1BIT::mix(int32_t* buffer, int cnt)
 {
        if(on && !mute && changed) {
                if(signal) {
-                       positive_clocks += passed_clock(prev_clock);
+                       positive_clocks += get_passed_clock(prev_clock);
                } else {
-                       negative_clocks += passed_clock(prev_clock);
+                       negative_clocks += get_passed_clock(prev_clock);
                }
                int clocks = positive_clocks + negative_clocks;
                int sample = clocks ? (max_vol * positive_clocks - max_vol * negative_clocks) / clocks : signal ? max_vol : -max_vol;
@@ -91,7 +98,7 @@ void PCM1BIT::mix(int32* buffer, int cnt)
                        }
                }
        }
-       prev_clock = current_clock();
+       prev_clock = get_current_clock();
        positive_clocks = negative_clocks = 0;
 }
 
@@ -101,45 +108,35 @@ void PCM1BIT::set_volume(int ch, int decibel_l, int decibel_r)
        volume_r = decibel_to_volume(decibel_r);
 }
 
-void PCM1BIT::init(int rate, int volume)
+void PCM1BIT::initialize_sound(int rate, int volume)
 {
        max_vol = volume;
 }
 
-#define STATE_VERSION  2
+#define STATE_VERSION  3
 
-void PCM1BIT::save_state(FILEIO* state_fio)
+bool PCM1BIT::process_state(FILEIO* state_fio, bool loading)
 {
-       state_fio->FputUint32(STATE_VERSION);
-       state_fio->FputInt32(this_device_id);
-       
-       state_fio->FputBool(signal);
-       state_fio->FputBool(on);
-       state_fio->FputBool(mute);
-       state_fio->FputInt32(changed);
-       state_fio->FputUint32(prev_clock);
-       state_fio->FputInt32(positive_clocks);
-       state_fio->FputInt32(negative_clocks);
-}
-
-bool PCM1BIT::load_state(FILEIO* state_fio)
-{
-       if(state_fio->FgetUint32() != STATE_VERSION) {
-               return false;
+       if(!state_fio->StateCheckUint32(STATE_VERSION)) {
+               return false;
+       }
+       if(!state_fio->StateCheckInt32(this_device_id)) {
+               return false;
+       }
+       state_fio->StateValue(signal);
+       state_fio->StateValue(on);
+       state_fio->StateValue(mute);
+       state_fio->StateValue(realtime);
+       state_fio->StateValue(changed);
+       state_fio->StateValue(prev_clock);
+       state_fio->StateValue(positive_clocks);
+       state_fio->StateValue(negative_clocks);
+       
+       // post process
+       if(loading) {
+               last_vol_l = last_vol_r = 0;
+               set_realtime_render(this, on & !mute);
+               //touch_sound();
        }
-       if(state_fio->FgetInt32() != this_device_id) {
-               return false;
-       }
-       signal = state_fio->FgetBool();
-       on = state_fio->FgetBool();
-       mute = state_fio->FgetBool();
-       changed = state_fio->FgetInt32();
-       prev_clock = state_fio->FgetUint32();
-       positive_clocks = state_fio->FgetInt32();
-       negative_clocks = state_fio->FgetInt32();
-       
-       // post process
-       last_vol_l = last_vol_r = 0;
-       return true;
+       return true;
 }
-