Newsgroup: it.comp.programmare.win32
Titolo: waveIn waveOut

Ciao,
c'e' un modo pulito per ottenere di buttare in uscita dalla scheda tutto
cio' che riceve in ingresso con un certo ritardo. Ho provato con le funzioni
nel soggetto, ma per quanto abbia usato doppi buffers e via dicendo, va
sempre a scatti. Non assicuro di non aver fatto schifezze, vista anche la
qualità della documentazione (VC 5.0). Se avete un'esperienza in merito o
qualche sito dove c'e' un sorgente da "imitare"... grazie!
Stefano.

Stefano.
Saluti,
    Mardy

aspettare che finisca! (sperando che sia questo il problema)
Il problema sembra un altro: io mantengo due buffer in uscita e con una
callback, quando mi viene notificata la fine del "primo" (e quindi dovrebbe
essere in esecuzione il secondo), riempio di nuovo il primo e lo spedisco.
Solo che questa operazione di notifica e riempimento sembra essere troppo
lenta e anche il secondo buffer finisce prima che gli venga spedito il
nuovo. In sostanza, usavo come buffer 1000 campioni con una frequenza di
11025 Hz, percio' circa un decimo di secondo.
Usando buffer molto piu' ampi lo "stacco" in riproduzione non si sente (ma
ovviamente mi crea un problema: il ritardo e' troppo lungo :-).
A questo punto ci sono due considerazioni: o il driver della scheda fa
schifo (*) oppure il problema non è comunque superabile con le API.
Quello che mi serviva era una semplice elaborazione in tempo reale del
segnale in ingresso. Tempo fa avevo un programma che simulava effetti per
chiatarra... e mi ero ispirato a quello sperando che utilizzasse le API per
ottenere il risultato...
Grazie comunque, Stefano.
(*) purtroppo la mia scheda sonora scandente (ma recente) e' defunta e ho
dovuto rimettere una
SB16 dei tempi che furono.


Non ho capito se sai o meno che puoi utilizzare piu' di due buffers:
utilizzane 3-4, dovresti riuscire a trovare un buon compromesso...
Saluti,
    Mardy

utilizzane 3-4, dovresti riuscire a trovare un buon compromesso...
Certo, lo so, ma il problema era con il buffer di output. Per avere poco
ritardo devo usare buffer piccoli e questi vengono scaricati prima che
possa spedirne altri e quindi si sente il salto. Comunque l'unica soluzione
decente che ho trovato è quella di mandare in loop un buffer grosso e
aggiornarlo al volo, senza farlo rilasciare dal driver (un po' sporchetto...
:-) ma per il momento mi accontento).
Se voglio essere veloce tra ingresso ed uscita, devo acquisire un buffer
piccolo e spedirne uno altrettanto piccolo. Quindi, in teoria, ne acquisivo
2 e poi li spedivo... in modo che durante la notifica di "fine" del primo,
il secondo suonasse e io avessi il tempo di rimandare il primo caricato con
i nuovi dati. Ma se i buffer sono piccoli, il tempo di notifica è più lungo
del tempo di svuotamento del secondo. Quindi dovrei mettere un margine di
"roba da suonare" maggiore, ma siccome la devo prima leggere, questa roba,
mi introduce un ritardo enorme.
Ho fatto diversi esperimenti con catene di buffer piccoli, grandi e via
dicendo... e può essre pure che abbia fatto degli errori io, ma non ho
ottenuto granché... comunque ora sono i ferie :-) e quindi...
Ma ora lasciamo questo problema, ne ho uno di più interessante. Da qualche
parte c'è l'opzione WAVE_FORMAT_DIRECT che dovrebbe permettermi di mandare i
dati tali e quali alla scheda (ora mi sono accorto che il driver li elabora,
o chi per lui, facendo un bel casino. Sembra che l'elaborazione consista
nell'acquisirli a frequenza maggiore e sottocampionarli... almeno da rumore
che si genera... bah).
Beh, quel parametro non viene accettato, con errore "parametro errato"... Ma
nelle capacità della scheda sembra che ci sia la possibilità...
Boh, purtroppo, tra l'help e i .h c'è una gran confusione...
Intanto sperimento... di accesso diretto al driver non se ne parla vero?
(intendo con controllo della frequenza di acquisizione e via discorrendo)
A presto, Stefano.

Mi intrometto in questa discussione, e me ne scuso, perchè sembrate 
gli unici che ne sappiano un pò.
Riposto un messaggio che appare in questo NG in cui 
tutti sembrate tenervi ben stretto il vostro sapere :-((((
Ho scritto un programma che registra e riproduce un 
numero finito di campioni. Dovendo fare in modo che 
si possa interrompere la registrazione mantenendo quanto 
registrato, vorrei sapere come faccio ad inserirmi in waveIn.
Il problema è che quando registro, o ascolto, gli altri bottoni
presenti sul form non sono accessibili.
Come faccio a renderli accessibili? Basterà poi impostare
un flag tramite pulsante che renda falso un while ed 
esegua direttamente waveInReset e waveInClose?
Uso il Builder VC++.
Grazie
                     Davide
e-mail: you must sobstitute NOSPAM with freemail

A presto, Stefano.
Saluti,
    Mardy

anche usando waveIn, potresti con facili operazioni aritmetiche variare la
Ho trovato l'sdk delle dx5 dove c'e' un filtro real time che ha gli stessi
problemi dei miei programmi :-) Quindi devo provare a cambiare scheda... non
vorrei che fosse questa... anche se ho l'impressione di no... oppure
prendermi l'sdk delle dx7 e vedere se c'eè qualcosa che fa per me :-)
Intanto, ciao!
Stefano.