funçao tone() com harbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

funçao tone() com harbour

Mensagem por Nascimento »

Amigos tenho uma funçao alarme que usa o beep do computador e pra minha surpresa no harbour nao funciona mais
pelo que observei so no windows 7 no xp ainda beepa há alguma especie de configuraçao no windows 7 que direcione a funçao beep para o pc-speak?
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Tente:

Código: Selecionar todos

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

HB_FUNC( BEEP )
{
   Beep( hb_parnl( 1 ), hb_parnl( 2 ) * 1000 );
}

#pragma ENDDUMP
Ou então tens que achar uma função no harbour, equivalente ao SNDPLAYSOUND() do FiveWin.

abs,
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Código: Selecionar todos

#include "FiveWin.ch"

function Main()

   SndPlaySound( "test.wav" )

return nil

DLL FUNCTION SndPlaySound( cFile AS LPSTR, nType AS WORD ) AS BOOL ;
  PASCAL FROM "sndPlaySoundA" LIB "WINMM.DLL"
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

funçao tone() com harbour

Mensagem por JoséQuintas »

Kapiaba.
Sobre a função que postou (Beep), é apenas uma dúvida.
Se usa API do WIndows, tem vantagem em fazer direto em C usando esse #pragma?

Por exemplo, uso pra pegar nome do usuário Windows:

Código: Selecionar todos

FUNCTION wapi_GetUserName()
   LOCAL cUserName := Space(255), nSize := 250
   CallDll( "GetUserNameA", "advapi32.dll", @cUserName, @nSize )
   cUserName := Trim( cUserName )
   RETURN cUserName
Imagino que seja pra velocidade, mas na prática não sei mesmo, por isso estou perguntando.
Pra mim que não mexo com linguagem C, deste outro jeito entendo melhor o fonte.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

funçao tone() com harbour

Mensagem por Nascimento »

amigo Kapiaba eu preciso que toque n pc-speak ou seja naquele beepzinho que tem na placa mae ou em algumas tem o conectorzinho
com falei a cima no xp ele ainda funciona dando os beeps pelo pc-speak ja no windows 7 como citado nao sai pelo pc-speak sai so pela placa de audio mais com um som estranho pacas , por isso queria ver se tem alguma forma de direcionar pra o pc-speak no windows 7
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

funçao tone() com harbour

Mensagem por JoséQuintas »

Lembrei agora de uma situação:
Uma cliente e seu notebook. Dependendo do momento, o beep dispara, e vira um som irritante.
Quando vi aquilo, retirei o beep. Isso foi há alguns anos atrás.

Se estiver usando janela gráfica, tem a mensagem de alerta do Windows, que usa o som configurado no Windows.
Dá uma olhada na hbwin, messagebox.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Senhores, eu acho que em windows 7 ou superior, somente o PLAYSOUND() funciona.

http://msdn.microsoft.com/en-us/library ... s.85).aspx

Abs.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

funçao tone() com harbour

Mensagem por rochinha »

Amiguinhos,

Josivan Nascimento,

- Verificou no SETUP se existe alguma opção que desligue o BEEP.
- Verificou na opção de som do Windows qual o esquema padrão de sons e se está ativado.

Tem umas máquinas, não sei se característica delas mas elas permitem que o som da multimídia, musicas, saia pelo auto-falante interno.

Como nosso amigo Kapiaba postou, voce pode usar o SndPlaySound() no Harbour por se tratar do uso direto de API do Windows.

Fiz este uso uma vez em um cliente e coloquei o som de chegada de email do Outlook 2007, para anunciar novos pedidos para o pc do caixa.

José Quintas,

O uso de #pragma permite embutir codigo não xBase diretamente no mesmo. Na compilação o Harbour trata cada caso.Acaba funcionando como um Wrappler, lembrando o método que usámos no Clipper para embutir código ASM e C.

Como eu não manjo de C prefiro usar o mesmo método que voce, mas algumas situações torna-se interessante fazer este uso.

Tanto o Harbour como o xHarbour tem suas funções de chamadas as APIs sendo CallDll() e DllCall(), respectivamente, cada uma com sua finalidade e resultado.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Senhores, o problema, é que a maioria das novas máquinas(computadores) não vem mais com alto falante interno, por isso, o comando BEEP() não funciona, como é o meu caso, meu PC, Ssomente tem CAIXAS DE SOM e não mais alto falantes.

Código: Selecionar todos

#include "FiveWin.ch"

function Main()

   Beep(4)

return nil

FUNCTION Beep(SOM) // assim, nao funciona em windows 7/8

    // assim, funciona:
    SndPlaySound(".\bdia.Wav", 0 )  // Caixa de Som

    SET CONSOLE ON

    // alto falante - nao funciona
    IF SOM=1         &&Sinal de Abandono

        TONE(87.3,2)

        TONE(40,7)

    ELSEIF SOM=2  &&Abertura

        TONE(1300,8)

        TONE(1800,5)

    ELSEIF SOM=3  &&Erro

        TONE(3000,1) ; TONE(2000,1) ; TONE(1000,1)

    ELSEIF SOM=4  &&Alerta

        TONE(2500,9)

    ELSEIF SOM=5  &&Confirma‡ao-I

        TONE(5000.1)

        TONE(5000.1)

    ELSEIF SOM=6  &&Abertura de menus

        TONE(5000.1)

    ELSEIF SOM=7

        TONE(50,4)

        TONE(70,4)

        TONE(130.8,6)

        TONE(196.0,6)

        TONE(500, 3)

        TONE(900, 2)

        TONE(1000)

        TONE(1000, 2)

        TONE(1500)

        TONE(1500, 2)

        TONE(1700, 1)

        TONE(2000)

        TONE(2000, 2)

        TONE(2400, 2)

        TONE(2800, 2)

        TONE(2500, 2)

        TONE(2600, 3)

        TONE(3000, 2)

    ENDIF

    SET CONSOLE OFF

RETURN( .T. )
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

funçao tone() com harbour

Mensagem por Jairo Maia »

Olá Pessoal,

A rigor, eu gostaria de ver algum colega postando uma solução para essa questão, pois mesmo com windows 7 o cliente não precisaria ter caixas de som para eventuais alertas sonoros do sistema. Mas pelo que vejo parece que não tem solução.

Outra coisa: Além de não mais as novas máquinas virem com alto-falantes internos, a partir do Windows 7 as funções de emissão de sons os emitem através da placa de som, e não diretamente pelo alto-falante interno. Lembrando também que no Harbour essas funções: Beep() e Tone() usam a API do Windows. Em OS até o XP, se não é detectado a placa de som (e a API do XP não faz essa comunicação), é emitido no alto-falante interno. Porém, a partir do 7 a API usa somente a placa.

Como o som gerado pela função Tone() é muito ruim no 7, acabei alterando minha função Alertar( nTipo ) para chamar a função Wapi_MessageBeep( nTipo ). Pelo menos os sons são mais agradáveis (usar a lib hbwin):

Código: Selecionar todos

#define BEEP_OK                  0x00000000
#define BEEP_TOQUE               0x00000010
#define BEEP_PERGUNTA            0x00000020
#define BEEP_EXCLAMACAO          0x00000030
#define BEEP_ASTERISCO           0x00000040
#define BEEP_SIMPLES             0xffffffff

Function Main()

 Clear Screen
 
 ? "BEEP_OK", " => ", Wapi_MessageBeep( BEEP_OK )
 Inkey( 1 )

 ? "BEEP_TOQUE", " => ", Wapi_MessageBeep( BEEP_TOQUE )
 Inkey( 1 )

 ? "BEEP_PERGUNTA", " => ", Wapi_MessageBeep( BEEP_PERGUNTA )
 Inkey( 1 )

 ? "BEEP_EXCLAMACAO", " => ", Wapi_MessageBeep( BEEP_EXCLAMACAO )
 Inkey( 1 )

 ? "BEEP_ASTERISCO", " => ", Wapi_MessageBeep( BEEP_ASTERISCO )
 Inkey( 1 )

 ? "BEEP_SIMPLES", " => ", Wapi_MessageBeep( BEEP_SIMPLES )

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

funçao tone() com harbour

Mensagem por Kapiaba »

Em fivewin e xHarbour esta função funciona, somente com as caixas de som ligadas.
E o som é o mesmo, não difere um do outro. mas funciona.

Código: Selecionar todos

#include "FiveWin.ch"

#define BEEP_OK          0x00000000
#define BEEP_TOQUE       0x00000010
#define BEEP_PERGUNTA    0x00000020
#define BEEP_EXCLAMACAO  0x00000030
#define BEEP_ASTERISCO   0x00000040
#define BEEP_SIMPLES     0xffffffff

Function Main()

 
 ? "BEEP_OK", " => ",         MessageBeep( BEEP_OK )

 ? "BEEP_TOQUE", " => ",      MessageBeep( BEEP_TOQUE )

 ? "BEEP_PERGUNTA", " => ",   MessageBeep( BEEP_PERGUNTA )

 ? "BEEP_EXCLAMACAO", " => ", MessageBeep( BEEP_EXCLAMACAO )

 ? "BEEP_ASTERISCO", " => ",  MessageBeep( BEEP_ASTERISCO )

 ? "BEEP_SIMPLES", " => ",    MessageBeep( BEEP_SIMPLES )

Return Nil
abs,
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

funçao tone() com harbour

Mensagem por Euclides »

Kapi, o comando MsgBeep() não tem parametro e por isso é que os DEFINES não funcionam.
Na seção FiveWin, coloquei um MsgBeep(n) com parametros.

Para produzir som nos altofalantes ou no "speaker", funciona o seguinte pelo comando DOS.
rundll32 user32.dll,MessageBeep
Isso pode ser executado dentro do programa também.
T+
Euclides
Responder