Ir para conteúdo
Fórum Script Brasil
  • 0

Output Sound


Thales Pontes Martins

Pergunta

Isso pode parecer uma pergunta estúpida, mas como eu faço para mandar um som produzido pelo meu programa para a caixa? Eu acho que deve ter alguma coisa a ver com api's do Windows.

Não tem urgência nenhuma, se alguém tiver uma idéia de por onde devo começar, posta aí que eu dou uma estudada.

Valeu.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0
Thales, ou talvez algo parecido com este exemplo no msdn? -> link
Opa, era disto que eu estava falando. Vou dar uma estudada no artigo e qualquer coisa eu posto aí. Muito obrigado.
Link para o comentário
Compartilhar em outros sites

  • 0

Eu ainda não lí o artigo todo, mas lá explica algumas coisas interessantes, como a idéia dos Sound Devices; Que existem devices com buffer estático para armazenar um som que vai ser tocado várias vezes no programa (como um tiro no Counter Strike), e devices com Streaming Buffer, que é um buffer pequeno que contantemente recebe novos dados e é reproduzido, para conteúdos longos onde não se pode prever o que vem depois (ex: um cara tocando piano no teclado do micro). É desse segundo que eu necessito. Não quero ter que gerar o som todo (vamos supor 10 minutos) na memória pra depois reproduzir, isso gastaria muita memória e levaria muito tempo para começar a reprodução. Eu quero ir sintetizando o som e ao mesmo tempo ir reproduzindo, e o som que já foi reproduzido não necessita mais de ficar na memória e pode ser destruído.

Agora, nesse artigo fala-se da necessidade da utilização do directx para se trabalhar com os Devices, mas se não me engano na Unit MMSystem do Delphi já existem essas rotinas (OpenDevice, GetDevice.....), não?

Foi uma pena eu não poder ter compilado o projeto desse artigo pois ele não foi feito no Borland C# Builder, que é o que eu tenho. E também não pude encontrar o .EXE para baixar.

Link para o comentário
Compartilhar em outros sites

  • 0

Thales, também achei interessante o artigo e, pelo que eu tinha entendido inicialmente, parecia estar na linha do que você queira implementar. Na verdade eu estava mesmo é procurando por um artigo que li há algum tempo atrás com relação ao uso dos "instrumentos presentes na placa", mas não encontrei.

Agora, nesse artigo fala-se da necessidade da utilização do directx para se trabalhar com os Devices, mas se não me engano na Unit MMSystem do Delphi já existem essas rotinas (OpenDevice, GetDevice.....), não?
É verdade. Mas se você quizer utilizar os "instrumentos na placa" ou tocar MP3 acho que não dá.

Não quero ter que gerar o som todo (vamos supor 10 minutos) na memória pra depois reproduzir, isso gastaria muita memória e levaria muito tempo para começar a reprodução. Eu quero ir sintetizando o som e ao mesmo tempo ir reproduzindo, e o som que já foi reproduzido não necessita mais de ficar na memória e pode ser destruído.
Acho que encontrei algo que vai lhe interessar. Utiliza MMSystem e trabalha com thereading, usando um buffer circular. Fiz uma modificação para viabilizar um loop.

A questão é que o arquivo é lido do disco (não gerado em tempo de execução como parece que você pretende usar) e nesta condição, a classe responsável pela leitura do arquivo, supostamente há a posibilidade da leitura de partes do arquivo para este buffer. Entretanto, o exemplo não implementa este recurso, tem que ser feita a adaptação para que o arquivo seja lido do início ao fim. Pelo menos foi a impressão que tive depois que carreguei um arquivo com 440Kb (apenas o início do som é ouvido).

O procedimento para testar é pressionar carregar bloco e a seguir resume (ou simplesmente marcar repetição).

Os originais estão neste link, mas há algumas inconsistências que não estam permitindo carregar o arquivo WAV. Fiz as correções e coloquei neste outro Download (Audio Thread Object.zip)

Caso não conheça o site Programmers Heaven, dê uma olhada neste (link). Alguns artigos estão desatualizados, mas acho que você vai poder aproveitar alguma coisa.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

É, é muita complexidade para fazer uma coisa simples.

Pelo pouco que percebi dando uma olhada no código, ele utiliza as funções WaveOutOpen, WaveOutWrite, WaveOut* . . .

Mas alí ele não faz um streaming, ele coloca o arquivo todo no buffer, estou certo?

Mas com essas funções deve ser possível fazer um streaming, eu suponho.

Na verdade eu estava mesmo é procurando por um artigo que li há algum tempo atrás com relação ao uso dos "instrumentos presentes na placa", mas não encontrei.

A minha intenção não é usar os instrumentos da placa, e sim permitir que o usuário grave suas próprias amostras de instrumentos e monte uma sequência; Seria como um novo tipo de module diferente dos já existentes (não tenho saco nem QI para hackear os já existentes). Sendo assim, se essas funções permitirem streaming e se eu tiver acesso direto ao buffer eu posso ajustar a nota dessas amostras, volume, separação estéreo, mixar os canais e salvar o resultado no buffer para reprodução.

E quanto aos intrumentos da placa, eu ví umas funções na MMSystem que trabalham com midis, midiOutOpen, midiInOpen... Acho que tem a ver com os instrumentos da placa.

Caso não conheça o site Programmers Heaven, dê uma olhada neste (link). Alguns artigos estão desatualizados, mas acho que você vai poder aproveitar alguma coisa.

Conheço sim, muito bom esse site, já baixei muita coisa lá, tem de tudo lá.

Uma coisa que notei é aquele registro com as informações do Wave que é passado para a função WaveOutOpen, não ví a informação de sinal nele, ou seja, se as palavras amostradas tem sinal ou não. Será que só permite com sinal?

Então, ainda permanece a dúvida do streaming.

Link para o comentário
Compartilhar em outros sites

  • 0
É, é muita complexidade para fazer uma coisa simples.
se eu tiver acesso direto ao buffer eu posso ajustar a nota dessas amostras, volume, separação estéreo, mixar os canais e salvar o resultado no buffer para reprodução.
Complexidade mesmo é inserir nota a nota as informações em arquivo wave. :blink:

Mas alí ele não faz um streaming, ele coloca o arquivo todo no buffer, estou certo?
Não. Se você observar o read é feito em um buffer de 4kb. E olhando melhor a classe, vai observar que ele lê do arquivo a partir da posição em que parou. Tipo, leu 4kb, posiciona nos próximos 4kb e lê. Foi o que conseguí visualizar. Inclusive, você deverá observar que o tamanho máximo do buffer, que é inicializado, é de 160kb (PLAYBACK_HIGH_BUFFER_SIZE na unit waveoutthread.pas).

Uma coisa que notei é aquele registro com as informações do Wave que é passado para a função WaveOutOpen, não ví a informação de sinal nele, ou seja, se as palavras amostradas tem sinal ou não. Será que só permite com sinal?
Acho que é melhor dar uma olhada no arquivo que eu inclui na versão que alterei - RIFF.TXT - ele apresente todo o lay-out do arquivo WAV.

Então, ainda permanece a dúvida do streaming.
Acho que passando o buffer para a lista circular, que será "tocado" pela thread (via resume) acho que daria para implementar.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, se é streaming está tudo certo.

O ruim é que o negócio é cheio de sacanagem, é PreprareHeader, é não sei mais oque.

Complexidade mesmo é inserir nota a nota as informações em arquivo wave.

isso é o de menos. E não é no arquivo, é no buffer.

O difícil é entender todas as estruturas e rotinas que existem para lidar com isso, porque são bem complexas.

outra coisa também que eu não entendí é como se faz pra saber quanto do buffer já foi reproduzido, isso porque eu quero preencher o buffer antes que ele seja completamente esvaziado para não correr o risco da reprodução cessar.

Vou ver oque posso fazer.

Qualquer um que souber ou ver alguma coisa interessante sobre esse assunto, ainda estou interessado em saber. Algum exemplo novo, qualquer coisa, podem postar.

PS: Amostragems acima de 8 bits é com sinal mesmo.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...