{ Programa para tocar arquivos de som e CDPlayer   }
{ Autor : Marcelo Luis Pimentel  }
{         e José Antonio Borges  }
{ Em 5/3/98 }

Program MidiaVox;
{$M 16384, 8192}

uses
    dvcrt, dvwin,
    winprocs, wintypes, strings, mmsystem;

var
    dispAberto: boolean;
    opcao : char;
    trilhas, trilhaAtual : integer;
    ret : longInt;
    linharet, nomeDisp : string;
    retorno: array [0..255] of char;

procedure Ajuda;
begin
  writeln ('As opções são: ');
  sintSom ('MIASOPC');
  writeln('    A - Toca um arquivo Multi-Midia');
  writeln('    C - Acionar CD-Player');
  writeln('    T - Toca arquivo atual');
  writeln('    F - Fim do Midiavox');

  sintsom('MIAJUDA');
end;

{  envia comando MCI para Windows processar }

Function EnviaComandoMCI (cmd : string) : LongInt;
var
    comando : array [0..127] of char;
    erro: longint;
begin
    strPCopy (comando, cmd);
    erro := mciSendString(comando, retorno, 127, 0);
    EnviaComandoMCI := erro;
    keypressed;
end;

{  erro no MCI  }

Procedure erroMCI (qualErro : longInt);
var
    retPas : string;
begin
    mciGetErrorString(qualErro, retorno, 255);
    sintsom ('MIERRMCI');
    retPas := strPas (retorno);
    sintWriteln (retPas);
end;

{  transforma retorno MCI em inteiro }

function pegaRetornoMci: longint;
var valor: longint;
    erro: integer;
begin
    val (strPas (retorno), valor, erro);
    pegaRetornoMci := valor;
end;

{    seleciona dispositivo a usar }

procedure EscolheDispositivo;
begin
    enviaComandoMCI ('close disp1');

    If nomedisp = ''  Then
        begin
            writeln ('Informe nome do arquivo : ');
            sintsom ('MIDIGNOM');
            sintReadln(nomedisp);
            If nomedisp = ''  then
                begin
                    sintsom('MIDESIST');
                    dispAberto := false;
                    exit;
                end;
        end;

    ret := enviaComandoMCI ('open ' + nomedisp + ' alias disp1');
    dispAberto := ret = 0;

    if dispAberto  Then
        begin
            If opcao <> #30  Then
                sintSom ('MIOK');
        end
    Else
        begin
            nomeDisp := '';
            sintSom ('MIDISNAO');
        end;
end;

{    acionamento do cdplayer    }

procedure CDPlayer;

    procedure ajudaCDPlayer;
    begin
    writeln;
    writeln ('As opcoes do CD-Player são : ');
    sintSom ('MIOPCCDP');
    writeln ('  L - Liga o CD-Player      D - Desliga o CD-Player');
    writeln ('  V - Volta música          A - Avança música');
    writeln ('  R - Repetir música        P - Pausa música');
    writeln ('  E - abre gaveta do CD     F - fecha gaveta do CD');
    writeln ('  N - escolher música       I - Informações sobre o dispositivo');
    writeln ('  S - estatisticas gerais   ESC - fim');
    sintsom ('MIAJUCDP');
    end;

var
    op : char;
    faixa : string;
    i, erro: integer;
    c: char;

label pula, executa;

begin
  writeln;

  ret := enviaComandoMCI ('status cdaudio ready');
  if strPas (retorno) = 'false' then
    begin
    writeln ('O CD-Player não está preparado.');
    sintSom ('MINAOACH');
    end;

  enviaComandoMCI ('open cdaudio');
  enviaComandoMCI ('set cdaudio time format tmsf');

  repeat
  textBackground (RED);
  write ('Qual a opção do CDPlayer ? ');
  textBackground (BLACK);

  sintsom ('MIQOPCDP');
  op := sintReadKey;
  writeln (op);
  op := upcase (op);
  delay (500);

executa:

  ret := 0;
  case op of

    'L', 'T', ^m: begin
                  enviaComandoMCI ('play cdaudio');
              end;

    'D' :       ret := enviaComandoMCI ('stop cdaudio');

    ' ', 'P' :  ret := enviaComandoMCI ('pause cdaudio');

    'E' :   { abre porta }
                 ret := enviaComandoMCI ('set cdaudio door open');

    'F' :   { fecha porta }
             begin
                   ret := enviaComandoMCI ('set cdaudio door closed');
                   enviaComandoMCI ('status cdaudio number of tracks');
                   sintWriteln (strPas(retorno) + ' trilhas');
             end;

    'A' : begin    { avançar faixa }
             enviaComandoMCI ('status cdaudio number of tracks');
             trilhas := pegaRetornoMCI;
             enviaComandoMCI ('status cdaudio current track');
             trilhaAtual := pegaRetornoMCI + 1;

             enviaComandoMCI ('stop cdaudio');
             if trilhaAtual <= trilhas then
                 begin
                     str (trilhaAtual, faixa);
                     ret := enviaComandoMCI ('play cdaudio from '+ faixa);
                 end;
        end;

    'V' : begin     { voltar faixa }
             enviaComandoMCI ('status cdaudio current track');
             trilhaAtual := pegaRetornoMCI - 1;
             enviaComandoMCI ('stop cdaudio');
             if trilhaAtual > 0 then
                 begin
                     str (trilhaAtual, faixa);
                     enviaComandoMCI ('play cdaudio from '+ faixa);
                 end;
         end;

    'R' : begin   { repetir faixa }
                enviaComandoMCI ('status cdaudio current track');
                faixa := strPas (retorno);
                enviaComandoMCI ('stop cdaudio');
                enviaComandoMCI ('play cdaudio from '+ faixa);
            end;

    'N' :  begin
              ret := enviaComandoMCI ('stop cdaudio');
              write ('Informe o número da faixa : ');
              sintSom ('MIINFNUM');
              sintReadln (faixa);
              enviaComandoMCI ('play cdaudio from ' + faixa);
           end;

    'I':   begin
               enviaComandoMCI ('status cdaudio ready');
               if strPas (retorno) <> 'true' then
                   begin
                       writeln ('O CD-Player não está preparado.');
                       sintSom ('MINAOACH');
                       goto pula;
                   end;

               enviaComandoMCI ('status cdaudio number of tracks');
               sintWrite ('Número de trilhas   ');
               sintWriteint (pegaRetornoMCI);
               writeln;

               enviaComandoMCI ('status cdaudio current track');
               sintWrite ('Trilha corrente     ');
               sintWriteint (pegaRetornoMCI);
               enviaComandoMCI ('status cdaudio length track ' + strPas (retorno));
               sintWrite (' com duração de ');
               sintWriteln (strPas (retorno));
           end;

    'S':   begin
               enviaComandoMCI ('status cdaudio ready');
               if strPas (retorno) <> 'true' then
                   begin
                       writeln ('O CD-Player não está preparado.');
                       sintSom ('MINAOACH');
                       goto pula;
                   end;

               sintWriteln ('Duração das trilhas');
               enviaComandoMCI ('status cdaudio number of tracks');
               trilhas := pegaRetornoMCI;

               for i := 1 to trilhas do
                   begin
                       str (i, faixa);
                       enviaComandoMCI ('status cdaudio length track ' + faixa);
                       sintWriteInt (i);
                       write ('   ');
                       sintWriteln (strPas(retorno));
                       if keypressed then break;
                   end;
               writeln;
           end;


    #27 : sintSom ('MIDESIST');

    Else
        begin
            while keypressed do readkey;
            ajudacDPlayer;
        end;
    End; { case }

    if op in ['L', 'T', 'R', 'V', 'A', 'N', ^m] then
       begin
             enviaComandoMCI ('set cdaudio time format tmsf');
             repeat
                  ret := enviaComandoMCI ('status cdaudio position');
                  write (strPas(retorno), #$0d);
                  delay (100);
             until keypressed;
             op := upcase(readkey);
             writeln;
             goto executa;
       end;

pula:

  until op = #27;
  enviaComandoMCI ('close cdaudio');
end;

{   aciona tocador de som  }

procedure AcionaTocador;
var cmdTecla : char;
    tocando: boolean;
begin

  If not dispAberto  then
    begin
    writeln('O dispositivo não está acessível.');
    sintsom ('MIDISNAO');
        nomeDisp := '';
    exit;
    end;

  ret := enviaComandoMCI ('play disp1 from 1');
  If ret <> 0  then
    begin
    erroMCI (ret);
    exit;
    end;

  writeln ('Use :  <ESPAÇO> PAUSE  <TAB> REPETE  <ESC> TERMINA');

  tocando := true;
  repeat
    cmdTecla := upcase(readKey);
    case cmdTecla of
        #27 : ret := enviaComandoMCI  ('stop disp1');
        ' ', ENTER:
            if tocando then
                begin
                    ret := enviaComandoMCI ('pause disp1');
                    tocando := false;
                end
            else
                begin
                   ret := enviaComandoMCI ('resume disp1');
                   tocando := true;
                end;

        TAB   : begin
                    enviaComandoMCI ('play disp1 from 1');
                    tocando := true;
                end;
    End;

    until cmdTecla = #27;
  sintSom ('MIOK');
end;

{   fala status atual   }

procedure statusDispositivo;
begin
  writeln;
  write ('Estado do dispositivo : ');
  sintsom ('MISTATUS');

  ret := enviaComandoMCI ('info disp1');
  If ret <> 0  Then
    begin
    if strLen (retorno) <> 0 then
                 sintWriteln ( strPas(retorno))
      Else sintwriteln ('ok ! ');
  end;

    writeln;
    end;


begin
  screensize.y := 10;
  clrscr;
  textBackground (BLUE);
  Writeln ('M I D I A V O X  -  Acionador Multimídia');
  textBackground (BLACK);
  sintInic (0, sintAmbiente ('MIDIAVOX', 'DIRMIDIAVOX'));

  If paramCount > 0  Then
    begin
      nomedisp := paramStr (1);
      opcao := #30;
    end
  Else
    begin
        opcao := ' ';
        nomedisp := '';
        sintsom ('MINICIAL');
    end;

  dispAberto := false;

  repeat
    writeln;

    If opcao <> #30  then
      begin
      textBackground (BLUE);
      write ('Midiavox - qual a opção ? ');
      textBackground (BLACK);
      sintSom ('MIQUALOP');
      opcao := upCase (sintReadkey);
      writeln(opcao);
      end;

    case opcao of

      #30 : begin
            EscolheDispositivo;
            acionaTocador;
            opcao := 'F';
            end;

      'A' : begin
            nomeDisp := '';
            escolheDispositivo;
            AcionaTocador;
            end;

      'T' : acionaTocador;

      'C' : CDPlayer;

      'F', #27 : sintSom ('MIFINAL');

      'I' : StatusDispositivo;
    Else
        begin
            while keypressed do readkey;
            ajuda;
        end;
      end;

    until opcao in ['F', #27];

    If dispAberto  then
        ret := enviaComandoMCI ('close disp1');
    sintfim;
    doneWinCrt;
end.
