home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / SWAG9605.DDD / 0103_VOC File Management.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-05-31  |  4.9 KB  |  248 lines

  1. UNIT vocdecl;  { see demo at end of document }
  2.  
  3. INTERFACE
  4.  
  5. function reset_dsp(base:word):boolean;
  6. procedure write_dac(level:byte);
  7. function read_dac:byte;
  8. function speaker_on:byte;
  9.  
  10. function speaker_off:byte;
  11.  
  12. procedure dma_pause;
  13. procedure dma_continue;
  14.  
  15. procedure play_back(sound:pointer;size:word;frequency:word);
  16. procedure play_voc(filename:string;buf:pointer);
  17. function  done_playing:boolean;
  18. function  play_raw(filename:string;buf:pointer):word;
  19.  
  20. IMPLEMENTATION
  21.  
  22. uses crt;
  23.  
  24. type
  25.   iDsound=record
  26.              dunno,
  27.              rate,
  28.              num_samples,
  29.              dunno2:word;
  30.            end;
  31.  
  32. var
  33.   dsp_reset:word;
  34.   dsp_read_data:word;
  35.   dsp_write_data:word;
  36.   dsp_write_status:word;
  37.   dsp_data_avail:word;
  38.  
  39.   since_midnight:longint absolute $40:$6C;
  40.   playing_till:longint;
  41.  
  42.  
  43. function reset_dsp(base:word):boolean;
  44. begin
  45.   base:=base*$10;
  46.  
  47.   dsp_reset:=base+$206;
  48.   dsp_read_data:=base+$20a;
  49.   dsp_write_data:=base+$20c;
  50.   dsp_write_status:=base+$20c;
  51.   dsp_data_avail:=base+$20e;
  52.  
  53.   port[dsp_reset]:=1;
  54.   delay(10);
  55.  
  56.   port[dsp_reset]:=0;
  57.   delay(10);
  58.  
  59.   reset_dsp:=(port[dsp_data_avail]and $80=$80)and(port[dsp_read_data]=$aa);
  60. end;
  61.  
  62. procedure write_dsp(value:byte);
  63. begin
  64.   while port[dsp_write_status] and $80<>0 do;
  65.   port[dsp_write_data]:=value;
  66. end;
  67.  
  68. function read_dsp:byte;
  69. begin
  70.   while port[dsp_data_avail]and $80=0 do;
  71.   read_dsp:=port[dsp_read_data];
  72. end;
  73.  
  74. procedure write_dac(level:byte);
  75. begin
  76.   write_dsp($10);
  77.   write_dsp(level);
  78. end;
  79.  
  80. function read_dac:byte;
  81. begin
  82.   write_dsp($20);
  83.   read_dac:=read_dsp;
  84. end;
  85.  
  86. function speaker_on:byte;
  87. begin
  88.   write_dsp($d1);
  89. end;
  90.  
  91. function speaker_off:byte;
  92. begin
  93.   write_dsp($d3);
  94. end;
  95.  
  96. procedure dma_continue;
  97. begin
  98.   playing_till:=since_midnight+playing_till;
  99.   write_dsp($d4);
  100. end;
  101.  
  102. procedure dma_pause;
  103. begin
  104.   playing_till:=playing_till-since_midnight;
  105.   write_dsp($d0);
  106. end;
  107.  
  108. procedure play_back(sound:pointer;size:word;frequency:word);
  109. var
  110.   time_constant:word;
  111.   page:word;
  112.   offset:word;
  113. begin
  114.   speaker_on;
  115.   size:=size-1;
  116.  { set up the dma chip }
  117.   offset:=seg(sound^)shl 4+ofs(sound^);
  118.   page:=(seg(sound^)+ofs(sound^)shr 4)shr 12;
  119.   port[$0a]:=5;
  120.   port[$0c]:=0;
  121.   port[$0b]:=$49;
  122.   port[$02]:=lo(offset);
  123.   port[$02]:=hi(offset);
  124.   port[$83]:=page;
  125.   port[$03]:=lo(size);
  126.   port[$03]:=hi(size);
  127.   port[$0a]:=1;
  128.  
  129.  { set the playback frequency }
  130.   time_constant:=256-1000000 div frequency;
  131.   write_dsp($40);
  132.   write_dsp(time_constant);
  133.  
  134.  { set the playback type (8-bit) }
  135.   write_dsp($14);
  136.   write_dsp(lo(size));
  137.   write_dsp(hi(size));
  138. end;
  139.  
  140. procedure play_voc(filename:string;buf:pointer);
  141. var
  142.   f:file;
  143.   s:word;
  144.   freq:word;
  145.  
  146.   h:record
  147.       signature:array[1..20]of char;
  148.       data_start:word;
  149.       version:integer;
  150.       id:integer;
  151.     end;
  152.   d:record
  153.       id:byte;
  154.       len:array[1..3]of byte;
  155.       sr:byte;
  156.       pack:byte;
  157.     end;
  158.  
  159. begin
  160.   {$i-}
  161. {  if pos('.',filename)=0 then filename:=filename+'.voc';}
  162.   assign(f,filename);
  163.   reset(f,1);
  164.   blockread(f,h,26);
  165.   blockread(f,d,6);
  166.   freq:=round(1000000/(256-d.sr));
  167.   s:=ord(d.len[3])+ord(d.len[2])*256+ord(d.len[1])*256*256;
  168.  { writeln('-----------header----------');
  169.   writeln('signature: ', h.signature);
  170.   writeln('data_start: ', h.data_start);
  171.   writeln('version: ', hi(h.version), '.', lo(h.version));
  172.   writeln('id: ', h.id);
  173.   writeln;
  174.   writeln('------------data-----------');
  175.   writeln('id: ', d.id);
  176.   writeln('len: ', s);
  177.   writeln('sr: ', d.sr);
  178.   writeln('freq: ', freq);
  179.   writeln('pack: ', d.pack);}
  180.   blockread(f,buf^,s);
  181.   close(f);
  182.   {$i-}
  183.   if ioresult<>0 then
  184.   begin
  185.     writeln('Can''t find voc file "',filename,'".');
  186.     halt(1);
  187.   end;
  188.   playing_till:=since_midnight+round(s/freq*18.20648193);
  189.   play_back(buf,s,freq);
  190. end;
  191.  
  192. function done_playing:boolean;
  193. begin
  194.   done_playing:=since_midnight>playing_till;
  195. end;
  196.  
  197. function play_raw(filename:string;buf:pointer):word;
  198. var
  199.   f:file;
  200.   s:word;
  201.   head:idSound;
  202. begin
  203.   play_raw:=0;
  204.   if pos('.',filename)=0 then filename:=filename+'.raw';
  205.   assign(f,filename);
  206.   {$i-} reset(f,1); {$i+}
  207.   if(ioresult<>0)then
  208.     exit;
  209.  
  210.   blockread(f,head,sizeof(head));
  211.   if(maxavail<head.num_samples)then exit;
  212.  
  213.   getmem(buf,head.num_samples);
  214.  
  215.   s:=head.num_samples;
  216.   blockread(f,buf^,s);
  217.   close(f);
  218.  
  219.   play_back(buf,s,head.rate);
  220.   playing_till:=since_midnight+round(s/head.rate*18.20648193);
  221.   play_raw:=head.num_samples;
  222.   freemem(buf,head.num_samples);
  223. end;
  224.  
  225. begin
  226.  if not reset_dsp(2)then
  227.  begin
  228.    writeln('SoundBlaster not found at 220h');
  229.    halt(1);
  230.  end else writeln('SoundBlaster found at 220h');
  231. end.
  232.  
  233. { ------------------------  DEMO --------------------- }
  234.  
  235. uses utils,vocdecl;
  236.  
  237. var
  238.   buf:pointer;
  239.  
  240. begin
  241.   if(paramcount<1)then
  242.   begin
  243.     writeln('Syntax: P [file].voc');
  244.     halt;
  245.   end;
  246.   getmem(buf,fsize(paramstr(1)));
  247.   play_voc(paramstr(1),buf);
  248. end.