+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [VB.NET] Eventi su riproduzione audio Directx

  1. #1
    cassvs non è in linea Novello
    Luogo
    Altavilla Silentina(SA)
    Post
    11

    [VB.NET] Eventi su riproduzione audio Directx

    Ciao, vi disturbo di nuovo...
    Avrei il bisogno di generare degli eventi durante la riproduzione di un file audio(utilizzo DirectX audiovideoplayback per riprodurlo). Gli eventi devono essere sincronizzati con l'audio. Ho effettuato delle prove utilizzando un timer con intervallo ad 1ms che va a generare l'evento se, la risultante della funzione .CurrentPosition è uguale a quella impostata da me nell'if... il problema è che non funziona sempre, ovvero il timer interno che conta la riproduzione dell'audio non si sincronizza con il mio timer e quindi a volte salta l'evento... come posso fare?

  2. #2
    L'avatar di alextyx
    alextyx non è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,602
    Non ho capito benissimo, comunque scordati che il timer scatti una volta ogni millisecondo. Calcola 80 o 100 ms per andare un po' tranquillo.

  3. #3
    cassvs non è in linea Novello
    Luogo
    Altavilla Silentina(SA)
    Post
    11
    In poche parole voglio che quando la musica arrivi ad esempio a 35 secondi dove c'è sul file audio il rumore di un sasso che cade nell'acqua, l'applicazione mi scriva su di una label la parola "attacco"... Io il controllo lo faccio fare confrontando il .CurrentPosition con una variabile stabilita da me(il tutto nel tick del timer),e a volte mi si scrive la label e a volte no..

  4. #4
    L'avatar di alextyx
    alextyx non è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,602
    Sarebbe meglio vedere un po' di codice, soprattutto dove prendi la decisione se scrivere o meno. Comunque, io userei una logica del genere:
    Definirei degli intervalli di tempo, ad esempio 29-31 (secondi) nei quali far scrivere una certa frase, poi controllerei, nella routine del timer (a questo punto anche ogni 200ms) se la current position è >= a 29 e =<31 e nel caso scriverei il testo adatto. Non so se fai così anche tu, ma penso di sì. Vediamo un po' il codice.

  5. #5
    cassvs non è in linea Novello
    Luogo
    Altavilla Silentina(SA)
    Post
    11
    Si, è proprio ciò che ho fatto... il problema è che l'applicazione dovrà successivamente inviare dei comandi ad un dispositivo che fa da centralina per un impianto d'illuminazione... il comando deve essere inoltrato in tempo reale e devo essere il più preciso possibile quindi non posso parlare di secondi.
    Io comunque faccio cosi:
    codice:
    Private Sub TimerChanges_Tick(sender As Object, e As EventArgs) Handles TimerChanges.Tick
                 If song.State = StateFlags.Running Then     'verifico che l audio sia in riproduzione
                     If song.CurrentPosition = Point then        'confronto la posizione del'audio in riproduzione con la variabile Point, entrambi di tipo double 
                         lblComando.text="attacco"                'scrivo su label
                     end if
                 end if
    End Sub
    Specifico che l'intervallo del timer è di 1 e che la variabile Point viene riempita direttamente dalla funzione .CurrentPosition alla pressione di un button apposito.

  6. #6
    L'avatar di alextyx
    alextyx non è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,602
    Riguardo a questa riga:

    If song.State = StateFlags.Running Then

    Che grandezze vengono confrontate? Dei secondi, dei decimi di secondo?
    Se non puoi ragionare in termini di secondi, puoi lavorare in termini di decimi di secondo, ma magari meglio se alcuni decimi. Il confronto che ti suggerivo prima, se devi beccare il 30esimo secondo, potrebbe essere tra 29,7 e 30,0, magari, giocando un po' sull'anticipo tenendo conto che poi gli effetti avranno un certo ritardo, ma questo puoi vederlo tu. Valuta che, se non esegui molto codice nell'evento del timer, puoi aspettarti che ti scatti abbastanza affidabilmente non più di ogni 100ms. Contare su tempi di 1 ms. vuol dire non aver mai fatto una ricerca con google sui timer di vb.net. Prova a farla, cercando di porre la domanda su quale è il tempo minimo impostabile e capirai quello che ti dico. Neppure un multimedia timer può arrivare a tanto, tenuto conto che poi c'è anche del codice da eseguire nell'evento. Allarga un po' le maglie del confronto e FORSE ce la potrai fare

  7. #7
    cassvs non è in linea Novello
    Luogo
    Altavilla Silentina(SA)
    Post
    11
    Ok più tardi allargo un po le maglie e vediam che succede :P
    il confronto: If song.State = StateFlags.Running Then
    serve solo a verificare che l'audio è in riproduzione.
    Il confronto per l'evento è:
    codice:
    If song.CurrentPosition = Point then
    dove song.CurrentPosition ritorna un numero decimale dove la parte intera(prima della virgola) sono i secondi, e la parte decimale sono i millesimi di secondo.
    Mentre Point è lo stesso un decimale riempito con un valore da me impostato , ad esempio l'ho riempito con il valore 1,0200 che corrisponde a 1sec e 200ms della traccia audio.

  8. #8
    L'avatar di alextyx
    alextyx non è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,602
    Quote Originariamente inviato da cassvs Visualizza il messaggio
    Ok più tardi allargo un po le maglie e vediam che succede :P
    il confronto: If song.State = StateFlags.Running Then
    serve solo a verificare che l'audio è in riproduzione.
    Il confronto per l'evento è:
    codice:
    If song.CurrentPosition = Point then
    dove song.CurrentPosition ritorna un numero decimale dove la parte intera(prima della virgola) sono i secondi, e la parte decimale sono i millesimi di secondo.
    Mentre Point è lo stesso un decimale riempito con un valore da me impostato , ad esempio l'ho riempito con il valore 1,0200 che corrisponde a 1sec e 200ms della traccia audio.
    Sì, sì, allarga le maglie, che un confronto basato su una uguaglianza, anzichè su un range, ha pochissime probabilità di essere preso per buono

  9. #9
    cassvs non è in linea Novello
    Luogo
    Altavilla Silentina(SA)
    Post
    11
    Carissimo mi scuso per il ritardo nell'aggiornamento del thread. Ho allargato le maglie come da tuo consiglio e già iniziava a dare buoni risultati, ma comunque i tempi di risposta erano un po lentini e alcuni eventi non li generava. ho poi snellito il codice del timer spostando le operazioni un po più pesanti in un backgroundworker e tutto va alla grande! ti ringrazio per le risposte sempre rapide ed esaustive
    E auguro a te ed a tutti una splendida giornata!

  10. #10
    L'avatar di alextyx
    alextyx non è in linea Moderatore Globale
    Luogo
    Prato
    Post
    2,602
    Ottimo, ciao e buon lavoro

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi