Il mio scopo è di ottenere un registratore per le vari device per costruire una DLL da utilizzare in altri ambiti.
Cercando sul web ed essendo appena approdato al C# ho trovato di appetibile questo snippet:
http://www.tek-tips.com/faqs.cfm?fid=4782
Ho creato varie funzioni per esempio per ottenere la lista dei device, il loro guid e nome, settare vari parametri ecc... però mi sono incartato sul salvataggio del buffer su file.
Così mi è venuto in aiuto lo snippet di cui ho postato il link, però stranamente il contenuto del WAV è nullo. Tutte le info sono scritte correttamente come la frequenza, durata, byte ecc... però il campo "DATA" del formato wav è nullo.
Il codice usato per salvare è quello dell'esempio:
- passo il capturebuffer ad uno stream
- apro uno stream di tipo file
- crea un array di byte e dentro ci metto la struttura di un file wav + lo stream del capturebuffer
- copio l'array di byte sullo stream di tipo file aperto prima (creo il file in pratica)
Ho controllato la lunghezza dello Stream quando viene riempito col capturebuffer ed è corretta e quindi non riesco a capire se il problema consiste nella creazione del file o nel riempimento del capturebuffer (che si riempirebbe di "nulla" nel senso che occuperebbe posto, ma posto "inutile").
A tal proposito volevo vedere se il capturebuffer aveva contenuto "valido" e quindi volevo creare una funzione Play() per ascoltarlo:
codice:
public void Play()
{
int writeposition, readposition;
Stream MemStream2 = new MemoryStream(); //capacità dinamica
//stream che conterrà tutte le info catturate
captureBuffer.GetCurrentPosition(out writeposition, out readposition);
captureBuffer.Read(0, MemStream2, writeposition, LockFlag.None);
//Ok, MemStream2 contiene i dati correttamente o almeno occupa le giuste pos
//copiamo il buffer di cattura su Memstream2
//Buffer per playare
BufferDescription bufferDescription = new BufferDescription(waveFormat);
//bufferDescription.BufferBytes = (int) MemStream2.Length; //settarlo da errore sconosciuto
bufferDescription.ControlPositionNotify = true;
bufferDescription.ControlFrequency = true;
bufferDescription.ControlPan = true;
bufferDescription.ControlVolume = true;
//C'è qualche problema qui
//[errore: indice oltre ai limite della matrice] se metto new Buffer(MemStrem, (int)MemStream.lenght, bufferDescription, device)
//[errore: valore non compreso nell'intervallo previsto] se metto new Buffer(bufferDescription, device);
Buffer bufferplay = new Buffer(bufferDescription, device); //errore qui
bufferplay.Format = waveFormat;
bufferplay.Write(0, MemStream2, (int)MemStream2.Length, LockFlag.EntireBuffer);
bufferplay.Play(0, BufferPlayFlags.Default);
MemStream2.Close();
}
Ma c'è un errore legato allo spazio occupato nel buffer...
Scusate la nabbanza, ma vediamo se qualcuno di voi sa darmi una mano.
Ringrazio in anticipo per l'attenzione.