Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: lucaevangelisti - Febbraio 13, 2017, 08:53:06 pm

Titolo: Un semplice beep
Inserito da: lucaevangelisti - Febbraio 13, 2017, 08:53:06 pm
Scusate la domanda da vero principiante, ma qual è il modo più semplice per ottenere un beep che funzioni sia in Linux che in Windows su una Applicazione GUI realizzata con Lazarus?
Titolo: Re:Un semplice beep
Inserito da: bonmario - Febbraio 14, 2017, 08:02:11 am
Ciao,
adesso non ho sotto mano Linux, eventualmente prova tu.
Su Windows uso "SysUtils.Beep;"
Il suono esce dalle casse/cuffie. Per farlo uscire dallo speaker del PC, non ne ho idea.

Ciao, Mario
Titolo: Re:Un semplice beep
Inserito da: xinyiman - Febbraio 14, 2017, 08:42:39 am
Io conosco solo questi due metodi

SysUtils.Beep o Crt.Sound(Hz)
Titolo: Re:Un semplice beep
Inserito da: lucaevangelisti - Febbraio 14, 2017, 02:20:34 pm
Io conosco solo questi due metodi

SysUtils.Beep o Crt.Sound(Hz)

Grazie xinyiman della risposta.

Ho provato entrambe le soluzioni e su Windows mi funzionano tutte e due, mentre su Linux (Xubuntu) invece non ottengo nulla. Acc.
Titolo: Re:Un semplice beep
Inserito da: xinyiman - Febbraio 14, 2017, 02:26:36 pm
Io conosco solo questi due metodi

SysUtils.Beep o Crt.Sound(Hz)

Grazie xinyiman della risposta.

Ho provato entrambe le soluzioni e su Windows mi funzionano tutte e due, mentre su Linux (Xubuntu) invece non ottengo nulla. Acc.

Vado a memoria, ma a me  sembra che su linux ci sia il comando beep da lanciare da terminale. (guarda la sintassi con man). E se ricordo bene fai prima a lanciarlo come comando esterno al programma. Guarda questa guida se non sai come fare:

http://wiki.freepascal.org/Executing_External_Programs

EDIT: qui trovi il comando per il beep da terminale di linux https://linux.die.net/man/1/beep
Titolo: Re:Un semplice beep
Inserito da: lucaevangelisti - Febbraio 15, 2017, 09:24:59 pm
Esiste una alternativa che permetta di scrivere un unico codice che possa poi essere compilato sia per Linux che per Windows?
Titolo: Re:Un semplice beep
Inserito da: xinyiman - Febbraio 15, 2017, 09:45:18 pm
Basta che fai tu una funzione con delle differenziazioni tra sistema operativo, guarda qui

http://www.lazaruspascal.it/index.php?page=12
Titolo: Re:Un semplice beep
Inserito da: Stilgar - Febbraio 15, 2017, 10:27:20 pm
Prendendo spunto da un traker (che i suoni li compone a partire dalle note e dai campioni audio):
https://github.com/milkytracker/MilkyTracker/tree/master/src/milkyplay/drivers

Qui ci sono alcune implementazioni. (Basta avere un'infarinatura di C++ per leggere il codice. :) )

Stilgar
Titolo: Re:Un semplice beep
Inserito da: lucaevangelisti - Febbraio 16, 2017, 02:20:05 pm
Grazie a entrambi. Studierò i vostri suggerimenti.

Nel frattempo ho risolto installando il componente Tplaysound http://wiki.freepascal.org/Play_Sound_Multiplatform (http://wiki.freepascal.org/Play_Sound_Multiplatform).
Titolo: Re:Un semplice beep
Inserito da: bonmario - Febbraio 16, 2017, 02:28:48 pm
Basta che fai tu una funzione con delle differenziazioni tra sistema operativo, guarda qui

http://www.lazaruspascal.it/index.php?page=12

Ciao,
vado un po' OT: il codice scritto in quell'esempio, è impreciso: infatti un Windows a 64 bit non verrebbe riconosciuto.
Io lo farei così:
Codice: [Seleziona]
function GetOsVer: string;
begin
  {$IFDEF MSWINDOWS}
    if WindowsVersion = wv95 then Result:='Windows 95'
    else if WindowsVersion = wvNT4 then Result:='Windows NT v.4'
    else if WindowsVersion = wv98 then Result:='Windows 98'
    else if WindowsVersion = wvMe then Result:='Windows ME'
    else if WindowsVersion = wv2000 then Result:='Windows 2000'
    else if WindowsVersion = wvXP then Result:='Windows XP'
    else if WindowsVersion = wvServer2003 then Result:='Windows Server 2003'
    else if WindowsVersion = wvVista then Result:='Windows Vista'
    else if WindowsVersion = wv7 then Result:='Windows 7'
    else Result:='Unknown';
  {$ENDIF}
  {$IFDEF UNIX}
    Result:='Linux';
  {$ENDIF}
end;

Inoltre, io preferisco usare {$IFDEF LINUX} invece di {$IFDEF UNIX}, anche se forse il risultato è lo stesso.

Ciao, Mario