{---------------------------------------------------------------------}
{    Projeto DOSVOX - NCE/UFRJ
{    Interface sonora para o Recognita
{    Autor: José Antonio Borges
{    Em 26/04/99
{---------------------------------------------------------------------}

{$M 16536,8192}
program convrm;

uses dvcrt, dvwin, dvmacro, dvInter, dvexec, winprocs, wintypes, strings, win31;

const
    versao = '1.1';
var
    s: string;
    janOriginal, minhaJan, janRm, janPlay: hWnd;
    processando: boolean;
    monitorAtivo: boolean;
    nomeArq, nomeSai: string;
    dirTrab: string;

    titulo, autor, copyRight: string;
    qualidade: char;

const
    msgTitulo = 'Interface para Real Producer';

{---------------------------------------------------------------------}

procedure mensagem (nomeArq: string; nlf: integer);
var i: integer;
    s: string;
begin
    if nomeArq = 'RMINIC' then
        s := 'Conversor para formato Real Media - v '
    else
    if nomeArq = 'RMCARGA' then
        s := 'Carregando Real Producer na memória'
    else
    if nomeArq = 'RMNAOENC' then
        s := 'Programa não foi encontrado'
    else
    if nomeArq = 'RMPROCAN' then
        s := 'Programa cancelado'
    else
    if nomeArq = 'RMNOMARQ' then
        s := 'Nome do arquivo de som'
    else
    if nomeArq = 'RMARQNAO' then
        s := 'Arquivo não existe'
    else
    if nomeArq = 'RMTITULO' then
        s := 'Título a adicionar'
    else
    if nomeArq = 'RMAUTOR' then
        s := 'Autor'
    else
    if nomeArq = 'RMCOPYRI' then
        s := 'Informações de CopyRight'
    else
    if nomeArq = 'RMQUALID' then
        s := 'Qualidade (normal, alta, perfeita) ? '
    else
    if nomeArq = 'RMNOMSAI' then
        s := 'Arquivo de saída (enter se usa mesmo nome)'
    else
    if nomeArq = 'RMESCUTA' then
        s := 'Deseja escutar o arquivo gravado ? '
    else
    if nomeArq = 'RMFIMPRG' then
        s := 'Programa terminado'
    else
    if nomeArq = 'RMEXEC' then
        s := 'Executando...'
    else
    if nomeArq = 'RMINICNV' then
        s := 'Iniciando conversão'
    else
    if nomeArq = 'RMFIMCNV' then
        s := 'Conversão completada'

    else
        s := '--> Mensagem invalida: ' + nomeArq;

    write (s);
    for i := 1 to nlf do
         writeln;

    if existeArqSom (nomeArq) then
        sintSom (nomearq)
    else
        sintetiza (s);
end;

{---------------------------------------------------------------------}

procedure cancelaMonitor;
var janMonitor, janAtual: hWnd;
begin
    janMonitor := findWindow (NIL, 'MONITVOX');
    monitorAtivo := janMonitor <> 0;
    janAtual := getFocus;
    if monitorAtivo then
        begin
            showWindow (janMonitor, sw_maximize);
            playInit (300);
            playVirtKey (VK_F4, false, false, true, 1);
            playStart;
            while playIsActive do;
        end;
    setFocus (janAtual);
end;

{---------------------------------------------------------------------}

procedure trocaJan (j: hWnd);
begin
    setActiveWindow (j);
    repeat
        calaboca;
        delay (100);
    until keypressed or (getActiveWindow = j);
end;

{---------------------------------------------------------------------}

procedure inicializa;
var placement: TWindowPlacement;
    dirConvRM: string;
begin
    janOriginal := getFocus;
    screenSize.y := 10;
    clrscr;
    minhaJan := getFocus;

    getDir (0, dirTrab);
    if dirTrab [length (dirTrab)] <> '\' then dirTrab := dirTrab + '\';

    cancelaMonitor;
    delay (1000);

    dirConvRM := sintAmbiente ('CONVRM', 'DIRCONVRM');
    if dirConvRm = '' then
        dirConvRm := 'c:\winvox\som\convrm';
    sintInic (0, dirConvRM);

    setWindowText (crtWindow, msgTitulo);
    textColor (WHITE);

    textBackGround (BLUE);
    mensagem ('RMINIC', 0);    {'Conversor para formato Real Media - v '}
    writeln (versao);
    sintSoletra (versao);
    textBackGround (BLACK);
end;

{---------------------------------------------------------------------}

procedure finaliza;
var nomeProg: string;
begin
    trocaJan (janRM);
    playInit (300);
    playVirtKey (VK_F4, false, false, true, 1);   {fecha página}
    playStart;
    while playIsActive do;

    trocaJan (minhaJan);
    while keypressed do readkey;

    mensagem ('RMFIMPRG', 1);    {'Programa terminado'}
    while sintFalando do;

    if monitorAtivo then
        begin
            nomeProg := sintAmbiente ('DOSVOX', 'MONITOR');
            executaProg (nomeProg, '', '');
        end;

    sintFim;
    setFocus (janOriginal);
    doneWinCrt;
end;

{--------------------------------------------------------}

procedure normalizaNome (var nomeArq: string);
begin
    if (pos ('\', nomeArq) = 0) and (pos (':', nomeArq) = 0) then
        nomeArq := dirTrab + nomeArq;
    if pos ('.', nomeArq) = 0 then
        nomeArq := nomeArq + '.WAV';
end;

{---------------------------------------------------------------------}

procedure pedeDados;
var arq: text;
    c2: char;
label erro, deNovoTitulo, deNovoAutor, deNovoCopy;
begin
    mensagem ('RMNOMARQ', 1);   {'Nome do arquivo de som'}
    sintReadln (nomeArq);
    if nomeArq = '' then
        begin
erro:
            mensagem ('RMPROCAN', 1);    {'Programa cancelado'}
            sintFim;
            doneWinCrt;
        end;

    assign (arq, nomearq);
    normalizaNome (nomearq);
    {$I-}  reset (arq);  {$I+}
    if ioresult <> 0 then
        begin
            mensagem ('RMARQNAO', 1);    {'Arquivo não existe'}
            goto erro;
        end
    else
        close (arq);

deNovoTitulo:
    mensagem ('RMTITULO', 1);     {'Título a adicionar'}
    sintReadln (titulo);
    if titulo = '' then goto deNovoTitulo;

deNovoAutor:
    mensagem ('RMAUTOR', 1);      {'Autor'}
    sintReadln (autor);
    if autor = '' then goto deNovoAutor;

deNovoCopy:
    mensagem ('RMCOPYRI', 1);     {'Informações de CopyRight'}
    sintReadln (copyright);
    if autor = '' then goto deNovoCopy;

    mensagem ('RMQUALID', 0);
    sintLeTecla (qualidade, c2);
    writeln;
    qualidade := upcase (qualidade);

    mensagem ('RMNOMSAI', 1);      {'Arquivo de saída (enter se usa mesmo nome)'}
    sintReadln (nomeSai);
end;

{---------------------------------------------------------------------}

procedure iniciaProducer;
const
    nomeDefault = 'C:\arquiv~1\Real\RealPr~1\realprod.exe';
var
    nomeProducer: string;
begin
    mensagem ('RMCARGA', 1);      {'Carregando Real Producer na memória'}

    nomeProducer := sintAmbiente ('CONVRM', 'NOMEPRODUCER');
    if nomeProducer = '' then
        nomeProducer := nomeDefault;

    writeln (nomeProducer);
    if executaProg (nomeProducer, '.', '') <= 32 then
        begin
            mensagem ('RMNAOENC', 1);   {'Programa não encontrado'}
            sintFim;
            doneWinCrt;
        end;

    repeat keypressed until getActiveWindow <> minhaJan;

    delay (1000);

    playInit (300);            { cancela janela inicial }
    playVirtKey (VK_ESCAPE, false, false, false, 100);
    playStart;
    while playIsActive do;

    sintClek;
    delay (2000);
    sintClek;

    janRm := getActiveWindow;
    trocaJan (minhaJan);
end;

{---------------------------------------------------------------------}

procedure executa;
var i: integer;
    nome: array [0..144] of char;
    f: hwnd;
begin
    mensagem ('RMEXEC', 1);    {'Executando...'}
    trocaJan (janRm);

    playInit (300);            { from file... }
    playAltKey ('F', 100);
    playKey ('R', 100);
    playKey ('F', 100);
    playStart;
    while playIsActive do;
    delay (1000);
    sintClek;

    playInit (400);
    playVirtKey (VK_END, false, false, false, 100);
    for i := 1 to 80 do
        playVirtKey (VK_BACK, false, false, false, 10);
    playStart;
    while playIsActive do;

    playInit (300);            { nome }
    playString (nomeArq, 1);
    playKey (Enter, 1);
    playStart;
    while playIsActive do;
    delay (1000);
    sintClek;

    playInit (300);            { titulo, autor, copyright }
    playString (titulo, 1);
    playKey (TAB, 100);
    playString (autor, 1);
    playKey (TAB, 100);
    playString (copyright, 1);
    playKey (ENTER, 1);
    playStart;
    while playIsActive do;
    delay (1000);
    sintClek;

    playInit (300);            { single rate }
    playVirtKey (VK_DOWN, false, false, false, 1);
    playKey (Enter, 1);
    playStart;
    while playIsActive do;
    delay (1000);
    sintClek;

    playInit (300);            { 28 K }
    for i := 1 to 7 do
        playVirtKey (VK_UP, false, false, false, 1);
    playKey (Enter, 1);
    playStart;
    while playIsActive do;
    delay (1000);
    sintClek;

    playInit (300);           { qualidade }
    for i := 1 to 7 do
        playVirtKey (VK_UP, false, false, false, 1);
    case upcase (qualidade) of
        'A':    playVirtKey (VK_DOWN, false, false, false, 1);
        'P':    begin
                    playVirtKey (VK_DOWN, false, false, false, 1);
                    playVirtKey (VK_DOWN, false, false, false, 1);
                end;
    end;
    playKey (Enter, 1);
    playStart;
    while playIsActive do;
    delay (1000);
    sintClek;

    playInit (300);            { nome de saida }
    playString (nomeSai, 1);
    playKey (Enter, 1);
    playStart;
    while playIsActive do;
    delay (1000);

    f := getFocus;
    getWindowText (getActiveWindow, nome, 144);
    if (strPas (nome) = '&Yes') or (strPas (nome) = '&Sim') then
        keyboardClick (ENTER);

    delay (1000);
    keyboardClick (ENTER);
    delay (1000);
    keyboardClick (ENTER);

    mensagem ('RMINICNV', 1);     {'Iniciando conversão'}

    delay (1000);
    janRm := getActiveWindow;

    playInit (300);            { start }
    playAltKey ('S', 1);
    playStart;
    while playIsActive do;

    repeat                         {*** faltou analisar erro de escrita em disco ***}
        delay (1000);
        getWindowText (getActiveWindow, nome, 144);
        writeln ('@', nome, '@');
    until (strPas (nome) = 'Recording Complete') or
          (strPas (nome) = 'Processing Complete');

    if strPas (nome) = 'Processing Complete' then
        keyboardClick (TAB);
    keyboardClick (ENTER);

    delay (3000);

    janRM := getActiveWindow;
    trocaJan (minhaJan);
    mensagem ('RMFIMCNV', 1);     {'Conversão completada'}
end;

{---------------------------------------------------------------------}

procedure testa;
var c, c2: char;
begin
    mensagem ('RMESCUTA', 0);    {'Quer escutar ? '}
    sintLeTecla (c, c2);
    writeln;
    if upcase (c) = 'N' then exit;

    trocaJan (janRm);
    playInit (300);            { nome de saida }
    playAltKey ('Y', 1);
    playStart;
    while playIsActive do;

    repeat
        delay (1000);
    until getActiveWindow <> janRm;

    delay (1000);
    keyboardClick (ENTER);   { evita janelas espúrias }
    delay (1000);

    janPlay := getActiveWindow;
    trocaJan (minhaJan);

    repeat until keypressed;
    while keypressed do readkey;

    trocaJan (janPlay);
    playInit (300);            { termina }
    playVirtKey (VK_F4, false, false, true, 1);
    playStart;
    while playIsActive do;

    delay (1000);
    trocaJan (minhaJan);
end;

{---------------------------------------------------------------------}

var c: char;
begin
    inicializa;
    pedeDados;
    iniciaProducer;
    executa;
    testa;
    finaliza;
end.
