Oppure

Loading
11/03/10 13:34
sirpesa
Salve, premetto che sono nuovo da queste parti e che ho provato a cercare nei post precedenti del forum ma non ho trovato nulla che potesse aiutarmi.. per cui se per caso cmi fosse sfuggito chiedo umilmente perdono =)

In ogni caso mi ritrovo a dover scrivere una applicazione che cattura dei dati da una piccola radio (input tramite jack audio) (utilizzata in un modo un pò strano, sostanzialemnte devo capire quando il segnale ricevuto è disturbato e mandare un'email) la parte software che comprende il campionamento dei dati e l'invio tramite smtp dell'email non è un problema, ho invece difficoltà a capire come gestire l'input audio.

Bazzicando in internet ho inteso che dovrei usare delle librerie DirectX, tali DirectInput o DirectAudio (credo decisamente la seconda).
Ho scaricato il tutto e ho provato a scrivere una semplice applicazione console che stampi "a schermo" i valori che riceve dalla scheda audio, ma è molto più complicato di quanto pensassi. Aggiungo il codice, anche se penso ci sia una serie di castronerie spaventose =)

        static void Main(string[] args)
        {
            Microsoft.DirectX.DirectSound.



            Capture SoundCapture = new Capture();
            CaptureBuffer MySoundBuffer;
            WaveFormat MyFormat = new WaveFormat();
            MyFormat.SamplesPerSecond = 22000;
            MyFormat.Channels = 1;
            MyFormat.BitsPerSample = 8;
            MyFormat.AverageBytesPerSecond = 22000;
            MyFormat.BlockAlign = 1;
            CaptureBufferDescription MySBufDesc = new CaptureBufferDescription();
            MySBufDesc.Format = MyFormat;
            MySBufDesc.BufferBytes = 100000;
            MySBufDesc.ControlEffects = false;
            MySBufDesc.WaveMapped = true;
            MySoundBuffer = new CaptureBuffer(MySBufDesc, SoundCapture);
            MemoryStream NStream = new MemoryStream(100);
            int count = 0, Byte = 0;
            MySoundBuffer.Start(true);
            for (; ; )
            {
                MySoundBuffer.Stop();
                //Narr = MySoundBuffer.Read(
                Console.WriteLine("read:" + Byte);
                MySoundBuffer.Read(1, NStream,10, Microsoft.DirectX.DirectSound.LockFlag.FromWriteCursor);
                count++;
                Console.WriteLine("read:" + Byte);
                while (Byte != -1)
                {
                    Byte = NStream.ReadByte();
                    Console.WriteLine("read:"+ Byte);
                }
                Byte = NStream.ReadByte() ;
                MySoundBuffer.Start(true);
                Thread.Sleep(100);
            }


la quale restiruisce un'errore all'istruzione
 MySoundBuffer.Read(1, NStream,10, Microsoft.DirectX.DirectSound.LockFlag.FromWriteCursor);
(che si corregge cambiando il flag da "fromWriteCursor" (o "EntireBuffer";) a "none" (però se non leggo niente a che serve -.- )

Premetto che la mia preparazione è quella di un comune studente di un'istituto tecnico, per cui non sono ancora molto a mio completo agio con strutture come frames, buffers e streams.

Qulasiasi aiuto sarebbe molto gradito, ringrazio in anticipo per la disponibilità. E mi scuso per eventuali castronerie =\.

Luca.
aaa
12/03/10 7:52
Il Totem
Le flags specificate descrivono il tipo di lock da adottare, ossia se bloccare l'intero buffer, o solo dal punto in cui si trova oppure se non attivare nessun blocco. Non c'entra nulla con quanti dati vengono letti, anche perchè sarebbe una contraddizione poter specificare un parametro del genere nella funzione Read.
aaa
12/03/10 19:01
sirpesa
ricevuto. grazie =)
aaa
14/03/10 13:17
sirpesa
Però resta il fatto che la funzione che legge dallo stream ritorna sempre '-1'..
non ne vengo fuori
aaa
19/03/10 16:02
sirpesa
up!

non c'è una semplice funzione che posso spammare che mi legge un valore dal micorofono senza incasinarmi la vita con buffers e co?
aaa
20/03/10 14:53
Il Totem
No.
aaa