/
file_smem.lpr
72 lines (62 loc) · 1.13 KB
/
file_smem.lpr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
program file_smem;
{$mode objfpc}{$H+}
uses
classes,
smem,
sysutils,
wave;
var
s: TSharedMemory;
w: TWaveOutDevice;
strm: TFileStream;
device, chan, rate: Int32;
buffer: array [0..4095, 0..1] of Single;
begin
if ParamCount() <> 3 then
begin
WriteLn('Usage: file_smem.exe file device channel');
w.Help;
Exit;
end;
try
strm := TFileStream.Create(ParamStr(1), fmOpenRead);
except
WriteLn('Error: unable to open file');
Exit;
end;
try
device := StrToInt(ParamStr(2));
except
WriteLn('Error: unable to convert device');
Exit;
end;
try
chan := StrToInt(ParamStr(3));
except
WriteLn('Error: unable to convert channel');
Exit;
end;
s.Open;
rate := -1;
repeat
if rate <> s.ctrl^.rate then
begin
w.Close;
rate := s.ctrl^.rate;
try
w.Open(device, rate)
except
WriteLn('Error: unable to open device');
Exit;
end;
end;
try
strm.ReadBuffer(buffer, w.size);
w.Play(buffer);
Move(buffer, s.data^[chan], w.size);
s.Notify;
except
Exit;
end;
until False;
end.