@@ -6,7 +6,7 @@ interface |
| 6 |
|
6 |
|
| 7 |
uses |
7 |
uses |
| 8 |
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn, |
8 |
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn, |
| 9 |
ExtCtrls, Spin, ComCtrls, constants, fgl; |
9 |
ExtCtrls, Spin, ComCtrls, constants, process, fgl; |
| 10 |
|
10 |
|
| 11 |
type |
11 |
type |
| 12 |
TOrdersSeenSet = specialize TFPGMap<Integer, Boolean>; |
12 |
TOrdersSeenSet = specialize TFPGMap<Integer, Boolean>; |
@@ -18,7 +18,9 @@ type |
| 18 |
{ TfrmRenderToWave } |
18 |
{ TfrmRenderToWave } |
| 19 |
|
19 |
|
| 20 |
TfrmRenderToWave = class(TForm) |
20 |
TfrmRenderToWave = class(TForm) |
| 21 |
Button1: TButton; |
21 |
RenderButton: TButton; |
|
|
22 |
CancelButton: TButton; |
|
|
23 |
ComboBox1: TComboBox; |
| 22 |
FileNameEdit1: TFileNameEdit; |
24 |
FileNameEdit1: TFileNameEdit; |
| 23 |
Label1: TLabel; |
25 |
Label1: TLabel; |
| 24 |
Label2: TLabel; |
26 |
Label2: TLabel; |
@@ -33,7 +35,9 @@ type |
| 33 |
SecondsSpinEdit: TSpinEdit; |
35 |
SecondsSpinEdit: TSpinEdit; |
| 34 |
OrderSpinEdit: TSpinEdit; |
36 |
OrderSpinEdit: TSpinEdit; |
| 35 |
LoopTimesSpinEdit: TSpinEdit; |
37 |
LoopTimesSpinEdit: TSpinEdit; |
| 36 |
procedure Button1Click(Sender: TObject); |
38 |
procedure CancelButtonClick(Sender: TObject); |
|
|
39 |
procedure RenderButtonClick(Sender: TObject); |
|
|
40 |
procedure ComboBox1Change(Sender: TObject); |
| 37 |
procedure FileNameEdit1AcceptFileName(Sender: TObject; var Value: String); |
41 |
procedure FileNameEdit1AcceptFileName(Sender: TObject; var Value: String); |
| 38 |
procedure FileNameEdit1Change(Sender: TObject); |
42 |
procedure FileNameEdit1Change(Sender: TObject); |
| 39 |
procedure FormShow(Sender: TObject); |
43 |
procedure FormShow(Sender: TObject); |
@@ -43,6 +47,10 @@ type |
| 43 |
TimesSeenTargetPattern: Integer; |
47 |
TimesSeenTargetPattern: Integer; |
| 44 |
|
48 |
|
| 45 |
OrdersSeen: TOrdersSeenSet; |
49 |
OrdersSeen: TOrdersSeenSet; |
|
|
50 |
Rendering: Boolean; |
|
|
51 |
CancelRequested: Boolean; |
|
|
52 |
|
|
|
53 |
procedure UpdateButtonEnabledStates; |
| 46 |
|
54 |
|
| 47 |
procedure ExportWaveToFile(Filename: String; Seconds: Integer); overload; |
55 |
procedure ExportWaveToFile(Filename: String; Seconds: Integer); overload; |
| 48 |
procedure ExportWaveToFile(Filename: String; OrderNum: Integer; Loops: Integer); overload; |
56 |
procedure ExportWaveToFile(Filename: String; OrderNum: Integer; Loops: Integer); overload; |
@@ -64,20 +72,51 @@ uses sound, machine, mainloop, vars, symparser; |
| 64 |
procedure TfrmRenderToWave.FileNameEdit1AcceptFileName(Sender: TObject; |
72 |
procedure TfrmRenderToWave.FileNameEdit1AcceptFileName(Sender: TObject; |
| 65 |
var Value: String); |
73 |
var Value: String); |
| 66 |
begin |
74 |
begin |
| 67 |
Button1.Enabled := (FileNameEdit1.FileName <> ''); |
75 |
UpdateButtonEnabledStates; |
|
|
76 |
end; |
|
|
77 |
|
|
|
78 |
procedure TfrmRenderToWave.RenderButtonClick(Sender: TObject); |
|
|
79 |
begin |
|
|
80 |
ProgressBar1.Position := 0; |
|
|
81 |
Rendering := True; |
|
|
82 |
CancelRequested := False; |
|
|
83 |
UpdateButtonEnabledStates; |
|
|
84 |
|
|
|
85 |
try |
|
|
86 |
if RadioGroup1.ItemIndex = 0 then |
|
|
87 |
ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value) |
|
|
88 |
else |
|
|
89 |
ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value); |
|
|
90 |
except |
|
|
91 |
on E: Exception do begin |
|
|
92 |
MessageDlg('Error!', 'Couldn''t write ' + FileNameEdit1.FileName + ' !' + LineEnding + |
|
|
93 |
LineEnding + E.Message, mtError, [mbOk], ''); |
|
|
94 |
end; |
|
|
95 |
end; |
|
|
96 |
|
|
|
97 |
ProgressBar1.Position := 0; |
|
|
98 |
Rendering := False; |
|
|
99 |
CancelRequested := False; |
|
|
100 |
UpdateButtonEnabledStates; |
|
|
101 |
end; |
|
|
102 |
|
|
|
103 |
procedure TfrmRenderToWave.CancelButtonClick(Sender: TObject); |
|
|
104 |
begin |
|
|
105 |
CancelRequested := True; |
|
|
106 |
UpdateButtonEnabledStates; |
| 68 |
end; |
107 |
end; |
| 69 |
|
108 |
|
| 70 |
procedure TfrmRenderToWave.Button1Click(Sender: TObject); |
109 |
procedure TfrmRenderToWave.ComboBox1Change(Sender: TObject); |
| 71 |
begin |
110 |
begin |
| 72 |
if RadioGroup1.ItemIndex = 0 then |
111 |
case ComboBox1.ItemIndex of |
| 73 |
ExportWaveToFile(FileNameEdit1.FileName, SecondsSpinEdit.Value) |
112 |
0: FileNameEdit1.Filter := 'Wave Files|*.wav'; |
| 74 |
else |
113 |
1: FileNameEdit1.Filter := 'MP3 Files|*.mp3'; |
| 75 |
ExportWaveToFile(FileNameEdit1.FileName, OrderSpinEdit.Value, LoopTimesSpinEdit.Value); |
114 |
end; |
| 76 |
end; |
115 |
end; |
| 77 |
|
116 |
|
| 78 |
procedure TfrmRenderToWave.FileNameEdit1Change(Sender: TObject); |
117 |
procedure TfrmRenderToWave.FileNameEdit1Change(Sender: TObject); |
| 79 |
begin |
118 |
begin |
| 80 |
Button1.Enabled := (FileNameEdit1.FileName <> ''); |
119 |
UpdateButtonEnabledStates; |
| 81 |
end; |
120 |
end; |
| 82 |
|
121 |
|
| 83 |
procedure TfrmRenderToWave.FormShow(Sender: TObject); |
122 |
procedure TfrmRenderToWave.FormShow(Sender: TObject); |
@@ -95,13 +134,19 @@ begin |
| 95 |
Notebook1.PageIndex := RadioGroup1.ItemIndex; |
134 |
Notebook1.PageIndex := RadioGroup1.ItemIndex; |
| 96 |
end; |
135 |
end; |
| 97 |
|
136 |
|
|
|
137 |
procedure TfrmRenderToWave.UpdateButtonEnabledStates; |
|
|
138 |
begin |
|
|
139 |
RenderButton.Enabled := (FileNameEdit1.FileName <> '') and not Rendering; |
|
|
140 |
CancelButton.Enabled := Rendering and not CancelRequested; |
|
|
141 |
end; |
|
|
142 |
|
| 98 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; Seconds: Integer); |
143 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; Seconds: Integer); |
| 99 |
var |
144 |
var |
| 100 |
CompletedCycles: QWord = 0; |
145 |
CompletedCycles: QWord = 0; |
| 101 |
CyclesToDo: QWord; |
146 |
CyclesToDo: QWord; |
|
|
147 |
OutStream: TStream; |
|
|
148 |
Proc: TProcess; |
| 102 |
begin |
149 |
begin |
| 103 |
Button1.Enabled := False; |
|
|
| 104 |
|
|
|
| 105 |
CyclesToDo := (70224*60)*Seconds; |
150 |
CyclesToDo := (70224*60)*Seconds; |
| 106 |
ProgressBar1.Position := 0; |
151 |
ProgressBar1.Position := 0; |
| 107 |
|
152 |
|
@@ -109,21 +154,54 @@ begin |
| 109 |
ResetSound; |
154 |
ResetSound; |
| 110 |
enablesound; |
155 |
enablesound; |
| 111 |
|
156 |
|
| 112 |
BeginWritingSoundToFile(Filename); |
|
|
| 113 |
|
|
|
| 114 |
FDCallback := nil; |
157 |
FDCallback := nil; |
| 115 |
|
|
|
| 116 |
load('hUGEDriver/preview.gb'); |
158 |
load('hUGEDriver/preview.gb'); |
|
|
159 |
chdir('hUGEDriver'); |
|
|
160 |
|
|
|
161 |
if ComboBox1.ItemIndex = 0 then begin |
|
|
162 |
OutStream := TFileStream.Create(Filename, fmCreate); |
|
|
163 |
end |
|
|
164 |
else begin |
|
|
165 |
Proc := TProcess.Create(nil); |
|
|
166 |
Proc.Executable := 'lame'; |
|
|
167 |
with Proc.Parameters do begin |
|
|
168 |
Add('-'); |
|
|
169 |
Add(Filename); |
|
|
170 |
end; |
|
|
171 |
Proc.Options := [poUsePipes]; |
|
|
172 |
Proc.Execute; |
| 117 |
|
173 |
|
| 118 |
while CompletedCycles < CyclesToDo do begin |
174 |
OutStream := TMemoryStream.Create; |
| 119 |
Inc(CompletedCycles, z80_decode); |
|
|
| 120 |
ProgressBar1.Position := Trunc((CompletedCycles / CyclesToDo)*100); |
|
|
| 121 |
if Random(500) = 1 then Application.ProcessMessages; |
|
|
| 122 |
end; |
175 |
end; |
| 123 |
|
176 |
|
| 124 |
EndWritingSoundToFile; |
177 |
try |
|
|
178 |
BeginWritingSoundToStream(OutStream); |
|
|
179 |
|
|
|
180 |
while (CompletedCycles < CyclesToDo) and not CancelRequested do begin |
|
|
181 |
Inc(CompletedCycles, z80_decode); |
|
|
182 |
ProgressBar1.Position := Trunc((CompletedCycles / CyclesToDo)*100); |
|
|
183 |
if Random(500) = 1 then Application.ProcessMessages; |
|
|
184 |
end; |
|
|
185 |
|
|
|
186 |
if CancelRequested then Exit; |
| 125 |
|
187 |
|
| 126 |
Button1.Enabled:=True; |
188 |
finally |
|
|
189 |
EndWritingSoundToStream; |
|
|
190 |
|
|
|
191 |
Chdir('..'); |
|
|
192 |
|
|
|
193 |
try |
|
|
194 |
if ComboBox1.ItemIndex = 1 then begin |
|
|
195 |
OutStream.Seek(0, soFromBeginning); |
|
|
196 |
Proc.Input.CopyFrom(OutStream, OutStream.Size); |
|
|
197 |
Proc.CloseInput; |
|
|
198 |
Proc.WaitOnExit; |
|
|
199 |
end; |
|
|
200 |
finally |
|
|
201 |
if ComboBox1.ItemIndex = 1 then Proc.Free; |
|
|
202 |
OutStream.Free |
|
|
203 |
end; |
|
|
204 |
end; |
| 127 |
end; |
205 |
end; |
| 128 |
|
206 |
|
| 129 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; |
207 |
procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; |
@@ -131,7 +209,7 @@ procedure TfrmRenderToWave.ExportWaveToFile(Filename: String; |
| 131 |
var |
209 |
var |
| 132 |
TimesToSeePattern: Integer; |
210 |
TimesToSeePattern: Integer; |
| 133 |
begin |
211 |
begin |
| 134 |
Button1.Enabled:=False; |
212 |
RenderButton.Enabled:=False; |
| 135 |
|
213 |
|
| 136 |
TimesToSeePattern := (LoopTimesSpinEdit.Value+1); |
214 |
TimesToSeePattern := (LoopTimesSpinEdit.Value+1); |
| 137 |
TimesSeenTargetPattern := 0; |
215 |
TimesSeenTargetPattern := 0; |
@@ -141,7 +219,7 @@ begin |
| 141 |
ResetSound; |
219 |
ResetSound; |
| 142 |
enablesound; |
220 |
enablesound; |
| 143 |
|
221 |
|
| 144 |
BeginWritingSoundToFile(Filename); |
222 |
//BeginWritingSoundToStream(Filename); |
| 145 |
|
223 |
|
| 146 |
FDCallback := @OrderCheckFD; |
224 |
FDCallback := @OrderCheckFD; |
| 147 |
|
225 |
|
@@ -160,9 +238,9 @@ begin |
| 160 |
end; |
238 |
end; |
| 161 |
end; |
239 |
end; |
| 162 |
|
240 |
|
| 163 |
EndWritingSoundToFile; |
241 |
EndWritingSoundToStream; |
| 164 |
|
242 |
|
| 165 |
Button1.Enabled:=True; |
243 |
RenderButton.Enabled:=True; |
| 166 |
end; |
244 |
end; |
| 167 |
|
245 |
|
| 168 |
procedure TfrmRenderToWave.OrderCheckFD; |
246 |
procedure TfrmRenderToWave.OrderCheckFD; |