Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Catturare audio in C#.
Forum - C# / VB.NET - Catturare audio in C#.

Avatar
sirpesa (Normal User)
Newbie


Messaggi: 4
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 14:34
Giovedì, 11/03/2010
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 =)

Codice sorgente - presumibilmente C++

  1. static void Main(string[] args)
  2.         {
  3.             Microsoft.DirectX.DirectSound.
  4.  
  5.  
  6.  
  7.             Capture SoundCapture = new Capture();
  8.             CaptureBuffer MySoundBuffer;
  9.             WaveFormat MyFormat = new WaveFormat();
  10.             MyFormat.SamplesPerSecond = 22000;
  11.             MyFormat.Channels = 1;
  12.             MyFormat.BitsPerSample = 8;
  13.             MyFormat.AverageBytesPerSecond = 22000;
  14.             MyFormat.BlockAlign = 1;
  15.             CaptureBufferDescription MySBufDesc = new CaptureBufferDescription();
  16.             MySBufDesc.Format = MyFormat;
  17.             MySBufDesc.BufferBytes = 100000;
  18.             MySBufDesc.ControlEffects = false;
  19.             MySBufDesc.WaveMapped = true;
  20.             MySoundBuffer = new CaptureBuffer(MySBufDesc, SoundCapture);
  21.             MemoryStream NStream = new MemoryStream(100);
  22.             int count = 0, Byte = 0;
  23.             MySoundBuffer.Start(true);
  24.             for (; ; )
  25.             {
  26.                 MySoundBuffer.Stop();
  27.                 //Narr = MySoundBuffer.Read(
  28.                 Console.WriteLine("read:" + Byte);
  29.                 MySoundBuffer.Read(1, NStream,10, Microsoft.DirectX.DirectSound.LockFlag.FromWriteCursor);
  30.                 count++;
  31.                 Console.WriteLine("read:" + Byte);
  32.                 while (Byte != -1)
  33.                 {
  34.                     Byte = NStream.ReadByte();
  35.                     Console.WriteLine("read:"+ Byte);
  36.                 }
  37.                 Byte = NStream.ReadByte() ;
  38.                 MySoundBuffer.Start(true);
  39.                 Thread.Sleep(100);
  40.             }



la quale restiruisce un'errore all'istruzione
Codice sorgente - presumibilmente Plain Text

  1. 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.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 8:52
Venerdì, 12/03/2010
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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
sirpesa (Normal User)
Newbie


Messaggi: 4
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 20:01
Venerdì, 12/03/2010
ricevuto. grazie =)

PM Quote
Avatar
sirpesa (Normal User)
Newbie


Messaggi: 4
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 14:17
Domenica, 14/03/2010
Però resta il fatto che la funzione che legge dallo stream ritorna sempre '-1'..
non ne vengo fuori

PM Quote
Avatar
sirpesa (Normal User)
Newbie


Messaggi: 4
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 17:02
Venerdì, 19/03/2010
up!

non c'è una semplice funzione che posso spammare che mi legge un valore dal micorofono senza incasinarmi la vita con buffers e co?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:53
Sabato, 20/03/2010
No.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote