2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
17 #define SIG_DATAREC_MIC 0
18 #define SIG_DATAREC_REMOTE 1
19 #define SIG_DATAREC_TRIG 2
24 class DATAREC : public DEVICE
28 outputs_t outputs_ear;
29 outputs_t outputs_remote;
30 outputs_t outputs_rotate;
31 outputs_t outputs_end;
32 outputs_t outputs_top;
33 outputs_t outputs_apss;
44 bool play, rec, remote, trigger;
45 _TCHAR rec_file_path[_MAX_PATH];
47 bool in_signal, out_signal;
49 int positive_clocks, negative_clocks;
56 int buffer_ptr, buffer_length;
57 uint8_t *buffer, *buffer_bak;
58 //#ifdef DATAREC_SOUND
59 int sound_buffer_length;
60 int16_t *sound_buffer, sound_sample;
62 bool is_wav, is_tap, is_t77;
65 int apss_buffer_length;
67 int apss_ptr, apss_count, apss_remain;
71 uint32_t pcm_prev_clock;
72 int pcm_positive_clocks, pcm_negative_clocks;
74 int32_t pcm_last_vol_l, pcm_last_vol_r;
75 int pcm_volume_l, pcm_volume_r;
76 //#ifdef DATAREC_SOUND
77 int32_t sound_last_vol_l, sound_last_vol_r;
78 int sound_volume_l, sound_volume_r;
82 int _tmp_buffer_length;
83 int _tmp_buffer_bak_length;
84 int _tmp_sound_buffer_length;
85 int _tmp_apss_buffer_length;
87 bool __DATAREC_SOUND_LEFT;
88 bool __DATAREC_SOUND_RIGHT;
90 double __DATAREC_FAST_FWD_SPEED;
91 double __DATAREC_FAST_REW_SPEED;
94 void update_realtime_render();
97 int load_wav_image(int offset);
98 void save_wav_image();
100 int load_tap_image();
101 int load_mzt_image();
102 int load_p6_image(bool is_p6t);
103 int load_bmjr_image();
104 int load_cas_image();
105 int load_m5_cas_image();
106 int load_msx_cas_image();
109 DATAREC(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
111 initialize_output_signals(&outputs_ear);
112 initialize_output_signals(&outputs_remote);
113 initialize_output_signals(&outputs_rotate);
114 initialize_output_signals(&outputs_end);
115 initialize_output_signals(&outputs_top);
116 initialize_output_signals(&outputs_apss);
120 //#ifdef DATAREC_PCM_VOLUME
121 // pcm_max_vol = DATAREC_PCM_VOLUME;
125 pcm_volume_l = pcm_volume_r = 1024;
126 //#ifdef DATAREC_SOUND
127 sound_volume_l = sound_volume_r = 1024;
129 __TYPE_MZ80B = false;
130 __DATAREC_SOUND = __DATAREC_SOUND_LEFT = __DATAREC_SOUND_RIGHT = false;
131 __DATAREC_FAST_FWD_SPEED = __DATAREC_FAST_REW_SPEED = 10.0;
132 my_tcscpy_s(message, 1023, _T("Stop"));
133 set_device_name(_T("Data Recorder"));
141 void write_signal(int id, uint32_t data, uint32_t mask);
142 uint32_t read_signal(int ch)
144 return in_signal ? 1 : 0;
147 void event_callback(int event_id, int err);
148 void mix(int32_t* buffer, int cnt);
149 void set_volume(int ch, int decibel_l, int decibel_r);
150 void update_config();
152 void save_state(FILEIO* state_fio);
153 bool load_state(FILEIO* state_fio);
156 void initialize_sound(int rate, int volume)
158 pcm_max_vol = volume;
160 void set_context_ear(DEVICE* device, int id, uint32_t mask)
162 register_output_signal(&outputs_ear, device, id, mask);
164 void set_context_remote(DEVICE* device, int id, uint32_t mask)
166 register_output_signal(&outputs_remote, device, id, mask);
168 void set_context_rotate(DEVICE* device, int id, uint32_t mask)
170 register_output_signal(&outputs_rotate, device, id, mask);
172 void set_context_end(DEVICE* device, int id, uint32_t mask)
174 register_output_signal(&outputs_end, device, id, mask);
176 void set_context_top(DEVICE* device, int id, uint32_t mask)
178 register_output_signal(&outputs_top, device, id, mask);
180 void set_context_apss(DEVICE* device, int id, uint32_t mask)
182 register_output_signal(&outputs_apss, device, id, mask);
184 void set_context_noise_play(NOISE* device)
186 d_noise_play = device;
188 NOISE* get_context_noise_play()
192 void set_context_noise_stop(NOISE* device)
194 d_noise_stop = device;
196 NOISE* get_context_noise_stop()
200 void set_context_noise_fast(NOISE* device)
202 d_noise_fast = device;
204 NOISE* get_context_noise_fast()
208 bool play_tape(const _TCHAR* file_path);
209 bool rec_tape(const _TCHAR* file_path);
211 bool is_tape_inserted()
213 return (play || rec);
215 bool is_tape_playing()
217 return (remote && play);
219 bool is_tape_recording()
221 return (remote && rec);
223 int get_tape_position()
225 if(play && buffer_length > 0) {
226 if(buffer_ptr >= buffer_length) {
228 } else if(buffer_ptr <= 0) {
231 return (int)(((double)buffer_ptr / (double)buffer_length) * 100.0);
236 const _TCHAR* get_message()
240 void set_remote(bool value);
241 void set_ff_rew(int value);
242 bool do_apss(int value);
243 double get_ave_hi_freq();