Ir ao conteúdo

a funçao API PlaySound() da-me 1 erro:(


Cambalinho

Posts recomendados

Postado

eis o meu codigo:

int SoundPlayEffect(char *FileName)
{
PlaySound((LPCSTR)FileName, NULL, SND_FILENAME);
return 0;
}

int SoundPlayBackGround(char *FileName)
{
PlaySound ((LPCSTR)FileName, NULL, SND_FILENAME | SND_LOOP);
return 0;
}

estas funçoes sao para fazer sons(ate as podia juntar;)).

o problema é que recebo este erro e nao sei o por que:(

"Deleting intermediate files and output files for project 'test - Win32 Debug'.

--------------------Configuration: test - Win32 Debug--------------------

Compiling...

test.cpp

Linking...

test.obj : error LNK2001: unresolved external symbol __imp__PlaySoundA@12

Debug/test.exe : fatal error LNK1120: 1 unresolved externals

Error executing link.exe.

test.exe - 2 error(s), 0 warning(s)"

alguem me pode dizer porque estes erros?

Postado
Provavelmente a função "PlaySound()" está definida como "extern", mas, no momento de linkar, a biblioteca que realmente possui essa função não é encontrada.

ok.. mas porque posso a usar em VB6?

porque esta na lista(quando fazes ctrl+space no você++6)?

Postado
Cambalinho,

http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680%28v=vs.85%29.aspx

Você encontra como compilar e linkar corretamente lendo o terceiro comentário.

Abs.

NW

penso que ja sei, mas nao consigo adicionar o ficheiro:(

eu estou a usar Visual C++ 6

penso que ja sei, mas nao consigo adicionar o ficheiro:(

eu estou a usar Visual C++ 6

ja consegui;)

vamos ao menu- Project - Settings e abre 1 janela. do lado esquerdo clicamos no nome do projecto e abrimos a folha Link(se nao clicarmos no nome do projecto, esta folha nao aparece). e vamos á caixa de texto Object\Library modules e escrevemos a dll(ou outro ficheiro dependente) na caixa de texto. de lembrar que a extençao tem de ser inserida e os ficheiros sao separados por espaço " ".

obrigado

outra questao: como meto o ficheiro a tocar e o programa passe para linha seguinte?

ja sei: a flag SND_ASYNC;)

como posso rodar 2 sons ao mesmo tempo?

eu ja tentei 1 class mas nao dá:(

class Sound
{
public: int SoundPlay(char *FileName, BOOL Repeat)
{
if (Repeat==TRUE)
{
PlaySound ((LPCSTR)FileName, NULL, SND_FILENAME | SND_LOOP | SND_ASYNC);
}
else
{
PlaySound((LPCSTR)FileName, NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);
}
return 0;
}
};

alguem me pode explicar o porque?

Postado
Pra isso, você precisa liberar a função da rotina principal, permitindo que mais de uma execução possa ocorrer ao mesmo tempo.

Existem duas alternativas.

Usando "fork()" ou programando em thread.

Exemplo de como fazer usando "fork()": http://www.dca.ufrn.br/~adelardo/cursos/DCA409/node34.html

Espero que ajude.

1 pergunta diferente, mas talvez me ajude melhor;)

eu só tenho 1 musica de fundo. e uma que é de 1segundo(para certas situaçoes). ou seja imagina isto: tens a musica de fundo, paras-a por 1 segundo, para executar a outra. e depois continuas a de fundo.

(eu ainda nao sei multitarefa)

mas posso fazer isso?

Postado

Pra conseguir parar uma rotina, iniciar a segunda e retomar pra primeira, vai precisar de processo multitarefa, não tem jeito.

Se estiver usando UNIX, dá pra usar "fork()". Ele retorna o PID de cada processo iniciado, daí daria para congelar um processo e iniciar o novo "fork()", depois, descongelar o processo anterior. Mas em Windows, isso não é possível.

Usando threads, é possível fazer isso em UNIX e Windows.

Vantagem em usar threads é que, a memória será compartilhada para os elementos do programa, ou seja, se tiver uma variável em comum que as threads usam, alterando o valor, altera o comportamento de todas elas no mesmo momento.

Postado

Olá,

Eu acho que o DirectSound poderia dar conta disso também.. não é tão simples assim como usar um PlaySound(), mas acho que funciona bem.

NW

Postado
Olá,

Eu acho que o DirectSound poderia dar conta disso também.. não é tão simples assim como usar um PlaySound(), mas acho que funciona bem.

NW

desculpa, mas o PlaySound() nao tem 1 comando, que faz com que a musica actual faça 1 pausa e execute a musica seguinte e depois continua a anterior?

Postado
Nesse link diz que não é possivel usar pause com o PlaySound. Comentam em usar a função mciSendString.

Talvez te ajude.

desculpa, mas como posso usar para ter o ID da musica?

eu se quero pausar a musica1, tenho que a identificar;)

Postado

Nesse link explica como iniciar.

Exemplo:


open new type waveaudio alias mysound

'mysound' será o identificador.

A partir daí, basta passar os comandos com o 'mysound' como parâmetro.

EDIT:

Mais um link, com o exemplo completo do tocador: Link

Postado
Nesse link explica como iniciar.

Exemplo:


open new type waveaudio alias mysound

'mysound' será o identificador.

A partir daí, basta passar os comandos com o 'mysound' como parâmetro.

desculpa podes me dar 1 string com o nome do ficheiro?

eu percebo que é isto:

mciSendString("open new type waveaudio alias mysound")

outra coisa: posso retirar "new type waveaudio alias"? a nao ser que "alias" tem haver com o nome mysound.(sem isto posso ler varios formatos de som)

mas onde fica o nome do ficheiro?

Postado

Consegui fazer algo assim:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <mmsystem.h>

int main(void)
{

char shortBuffer[MAX_PATH];
char command[256] = {'\0'};

GetShortPathNameA("C:\\snd\\test.wav", shortBuffer, sizeof(shortBuffer) );

sprintf(command, "open %s type waveaudio alias MY_SND", shortBuffer);

mciSendString(command, 0, 0, 0);
mciSendString("play MY_SND", 0, 0, 0);

return 0;
}

Precisa linkar a biblioteca libwinmm.a.

Não saiu som, mas acho que é por causa da minha biblioteca (MinGW).

Veja se funciona, pra você.

Postado
Consegui fazer algo assim:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <mmsystem.h>

int main(void)
{

char shortBuffer[MAX_PATH];
char command[256] = {'\0'};

GetShortPathNameA("C:\\snd\\test.wav", shortBuffer, sizeof(shortBuffer) );

sprintf(command, "open %s type waveaudio alias MY_SND", shortBuffer);

mciSendString(command, 0, 0, 0);
mciSendString("play MY_SND", 0, 0, 0);

return 0;
}

Precisa linkar a biblioteca libwinmm.a.

Não saiu som, mas acho que é por causa da minha biblioteca (MinGW).

Veja se funciona, pra você.

obrigado. funciona, mas detecto 1 erro. mas veja a class:

class Sound
{
public: int SoundPlay(char *FileName, BOOL Repeat)
{
char shortBuffer[MAX_PATH];
char command[256] = {'\0'};

GetShortPathNameA(FileName, shortBuffer, sizeof(shortBuffer) );


if (Repeat==TRUE)
{
sprintf(command, "open %s type waveaudio alias MY_SND", shortBuffer);
mciSendString(command, 0, 0, 0);
mciSendString("play MY_SND", 0, 0, 0);
}
else
{
mciSendString("pause MY_SND", 0, 0, 0);
sprintf(command, "open %s type waveaudio alias MY_EFFECT", shortBuffer);
mciSendString(command, 0, 0, 0);
mciSendString("play MY_EFFECT", 0, 0, 0);
mciSendString("play MY_SND", 0, 0, 0);
}
return 0;
}
};

então qual é o problema? é que no else, só executa 1 vez. ou seja quando faço novamente o if, o som EFFECT nao é executado:(

pode me explicar o que fiz mal?

isso tem haver com o meu codigo if, mas funciona. obrigado por tudo

Postado

Salve Black,

Não saiu som, mas acho que é por causa da minha biblioteca (MinGW).

Veja se funciona, pra você.

Incluindo 'wait' à string aí ele toca... sem essa flag aqui ele também não toca.

mciSendString("play MY_SND wait", 0, 0, 0);

Abs.

NW

Postado
Salve Black,

Incluindo 'wait' à string aí ele toca... sem essa flag aqui ele também não toca.

Abs.

NW

desculpa, toca 1 vez. mas quando o chamo, novamente, ja nao toca:(

Postado

Essa chamada nem sempre será verdadeira:


else
{
mciSendString("pause MY_SND", 0, 0, 0);

Se eu chamar a função pela primeira vez, declarando "REPEAT == FALSE", o programa fará uma chamada de PAUSE da música, sem nem mesmo ter uma tocando.

Talvez seja esse o problema.

Postado
Essa chamada nem sempre será verdadeira:


else
{
mciSendString("pause MY_SND", 0, 0, 0);

Se eu chamar a função pela primeira vez, declarando "REPEAT == FALSE", o programa fará uma chamada de PAUSE da música, sem nem mesmo ter uma tocando.

Talvez seja esse o problema.

neste caso, primeiro toca a musica de fundo, depois quando apanho os diamantes. ao apanhar o primeiro diamante, a musica de fundo dá 1 pausa e toca a do efeito. só depois continua a de fundo. mas nos proximos diamantes nao o faz:(

Postado

Pelo o que entendi sobre a biblioteca, depois que encerrar a música, precisa fechar o arquivo e abri-lo novamente.


mciSendString("close MY_EFFECT", 0, 0, 0);

Segue link para a lista completa dos comandos.

Postado
Consegui fazer algo assim:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <mmsystem.h>

int main(void)
{

char shortBuffer[MAX_PATH];
char command[256] = {'\0'};

GetShortPathNameA("C:\\snd\\test.wav", shortBuffer, sizeof(shortBuffer) );

sprintf(command, "open %s type waveaudio alias MY_SND", shortBuffer);

mciSendString(command, 0, 0, 0);
mciSendString("play MY_SND", 0, 0, 0);

return 0;
}

Precisa linkar a biblioteca libwinmm.a.

Não saiu som, mas acho que é por causa da minha biblioteca (MinGW).

Veja se funciona, pra você.

funciona. mas tive de usar a multitarefa. obrigado

  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!