PDA

View Full Version : [vb net 2008] 2 wav in contemporanea


superbau
14-10-2009, 18:11
salve,
qualcuno sa dirmi come si può fare ad esseguire un loop in sottofondo, e un altro suono in contemporanea?

io ho fatto così, ma uno esclude l'altro:

Imports System.Media
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

My.Computer.Audio.Play("08.wav", AudioPlayMode.BackgroundLoop)

End Sub

Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click

My.Computer.Audio.Play("die01.wav", AudioPlayMode.Background)

End Sub

Diablo-IT
15-10-2009, 00:24
Dai un occhiata alle api "mci send string" oppure "mci send command" (libreria winmm.dll).
Tra i vari parametri che puoi impostare ne trovi uno chiamato "shareable", che ti permette di aprire piu' di un device (file wav etc) in contemporanea.
Prima pero' verifica attraverso il parametro "capabilities" se tale device puo' essere impostato come "shareable" oppure no.
Vado a memoria ma se ricordo bene e' cosi', controlla sull'msdn la documentazione completa relativa a queste api.

E' la soluzione piu' semplice che mi viene in mente al momento (le utilizzai con vb6+win 98, e' passato parecchio tempo he he).

MarcoGG
15-10-2009, 20:26
salve,
qualcuno sa dirmi come si può fare ad esseguire un loop in sottofondo, e un altro suono in contemporanea?

io ho fatto così, ma uno esclude l'altro:

Ci sono varie tecniche possibili, al momento ne segnalo 2 :

1. Forse la più semplice in assoluto > Rif. COM - Windows Media Player :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim WMP As New WMPLib.WindowsMediaPlayer
WMP.settings.autoStart = True
WMP.settings.setMode("Loop", True)
WMP.URL = "C:\1.wav"

End Sub

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

Dim WMP As New WMPLib.WindowsMediaPlayer
WMP.settings.autoStart = True
WMP.URL = "C:\2.wav"

End Sub

2. DirectX / DirectSound :
http://gpwiki.org/index.php/VBNET:DirectSound

superbau
16-10-2009, 13:04
ti ringrazio, però la seconda, ovvero quella che va nel click mi funziona, mentre quella di loop in sottofondo nel load event non vuol saperne di partire. non riesco a capire per quale motivo si ostina a non partire, si che non ce niente che parta prima di lei

se invece lo metto su un pulsate, questo parte, ma si blocca dopo un 5 secondi circa, mentre dovrebbe durare molto di +, oltretutto essendo in loop non dovrebbe nemmeno fermarsi.



Dim WMP As New WMPLib.WindowsMediaPlayer
WMP.settings.autoStart = True
WMP.settings.setMode("Loop", True)
WMP.URL = "C:\1.wav"



Per quanto riguarda l'esempio delle direct x, l'avevo provato ieri ma non mi partiva,non so per quale motivo, se non ricordo male non riuscivo a definire DSDev che non so cosa sia:

dim TheSound as DirectSound.SecondaryBuffer=new DirectSound.SecondaryBuffer("C:\sound.wav",BufferDesc,DSDev)

avevo provato questo esempio giusto perchè mi interessava anche regolare il volume anche se non era così indispensabile per la mia applicazione.
Ho guardato anche la guida in locale, ma con directsound.secondaryBuffer mi esce na cippa.

Cmq mi piace molto di + l'esempio prima che hai riportato usando le libreirie di WindowsMediaPlayer se riesco a farlo partire nel load in loop sarebbe ideale

MarcoGG
16-10-2009, 14:29
ti ringrazio, però la seconda, ovvero quella che va nel click mi funziona, mentre quella di loop in sottofondo nel load event non vuol saperne di partire. non riesco a capire per quale motivo si ostina a non partire, si che non ce niente che parta prima di lei

se invece lo metto su un pulsate, questo parte, ma si blocca dopo un 5 secondi circa, mentre dovrebbe durare molto di +, oltretutto essendo in loop non dovrebbe nemmeno fermarsi.
...
...
Cmq mi piace molto di + l'esempio prima che hai riportato usando le libreirie di WindowsMediaPlayer se riesco a farlo partire nel load in loop sarebbe ideale

Ho postato quel codice perchè per me è perfettamente funzionante.
Ogni suono deve stare sulla sua istanza di WMP se si vuole la sovrapposizione.
Potrebbe essere un problema legato a quel file .wav particolare, soprattutto se è un WAV che proviene da conversioni da altri formati, come ad es. MP3>WAV, ecc...

superbau
16-10-2009, 16:36
in effetti il wav era inizialmente un file mp3. ci sono dei parametri da settare quando trasformo un mp3 in wav?

con formatFactory ho messo così nella conversione:

Campionamento: 44100
Bitrate: opzione standard
canale audio: 2
volume: 100%

che sia il bitrate che non riesco a modificare il problema?

MarcoGG
16-10-2009, 20:09
in effetti il wav era inizialmente un file mp3. ci sono dei parametri da settare quando trasformo un mp3 in wav?

con formatFactory ho messo così nella conversione:

Campionamento: 44100
Bitrate: opzione standard
canale audio: 2
volume: 100%

che sia il bitrate che non riesco a modificare il problema?

Non sono un gran esperto in formati audio e conversioni varie, penso dovresti chiedere nella sezione "Programmi e Utility" riguardo a questo aspetto.
Comunque, se fai N prove usando i vari WAV di sistema ( i suoni di Windows ), vedrai che la tecnica funziona.
Secondo me il problema sta proprio lì, ossia qualcosa è "andato storto" nella conversione. Poco male, perchè con WMP non c'è più la limitazione ai soli WAV, perciò puoi usare l'Mp3 originario... ;)

superbau
16-10-2009, 20:37
oh che bello mi hai dato una buona notizia, allora lo lacio in mp3 :)

superbau
16-10-2009, 20:47
ho messo in mp3, come era il file originale e funziona tutto perfettamente, però dopo un po cmq si blocca (anche se dura più di prima quando usavo la sua conversione in wav)

Questa cosa che mi trovanca l'audio da solo dopo tot di tempo non lo capisco propio.

Ho provato a far eseguiere il file nel load senza far partire l'altro wav, ma niente, si blocca lo stess dopo un tot di tempo..

superbau
16-10-2009, 20:56
uhm ho scoperto una cosa strana...
ho il mio input box, dopo le righe di codice che carica l'audio nel load, se non batto invio per mandare il msgbox, l'audio di sottofondo funzia senza inceppamenti.. uhm

addirittura se lo levo nemmeno parte l'audio...

mi sembra quasi che non "faccia intempo" a leggere il file audio... infatti se lascio l'input box, il mouse va in "attesa" per un po.. e se aspetto che mi ritorni la frecettina, l'audio funzia fino in fondo. viceversa senza input box non mi compare nessuna cursore a forma di "attesa" e l'audio non parte.

rettifico.. se aspetto che mi sparisca il cursore di attesa e subito dopo batto ok nell'input box, la musica parte, ma a un certo punto si blocca... molto + in la nel tempo ma si blocca... sembra, anzi mi è, correlato il tempo che resta aperto l'input box con il tempo del file mp3. infatti lasciandolo aperto 4 minuti o anche qualche secondo in meno(4 minuti è il tempo del mio mp3) la canzone viene eseguita tutta.



Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'audio in sottofondo
Dim WMP1 As New WMPLib.WindowsMediaPlayer
WMP1.settings.autoStart = True
WMP1.settings.setMode("Loop", True)
WMP1.settings.volume = 25

WMP1.URL = "08.mp3"


'input box------------------Nome utente-------

Dim message, title As String
title = "Inserimento dati "
message = "Scrivi Il tuo Nome"
'variabile input box da recuperare
NomeUtente = InputBox(message, title)
'--------------------------------------------
NomeUtente = Trim(NomeUtente)
ecc..

MarcoGG
16-10-2009, 23:00
Io ho provato il tuo codice con un mio mp3 e funziona, nessun problema.
Dipende anche da ciò che segue nel Load. Se hai caricato codice pesante nel Load della Form ( cicli, interazione con DB, ecc... ), potrebbe interferire con la riproduzione. La InputBox è bloccante, ossia interrompe l'esecuzione del codice finchè non viene accettata o annullata, il che spiegherebbe il fatto che se non la chiudi, il codice che segue nel Load non va in esecuzione, permettendo la completa esecuzione del file mp3 senza intoppi...

In ogni caso :
- Il comportamento di quel file mp3 secondo me è anomalo.
- Mai sovraccaricare il Load di una Form. Spesso gioca brutti scherzi...

superbau
17-10-2009, 01:53
grazie per i consigli, ora sto eseguendo + c he altro un form di prova per vedere se riesco ad raccappezarmi con quanto voglio fare. appena finisco, ottimizzerò il tutto per benino e cercherò di limitare l'utilizzo del form load. magari mi rifaccio il progetto da zero tenendo il mio form di prova come spunto. In effetti non son stato tanto a gurdare la forma, scrivevo di getto il codice ^_^