Tra i requisiti di Windows Phone rientra la presenza sul dispositivo del microfono che può rivelarsi uno strumento molto utile in diverse tipologie di applicazioni che fanno uso della voce, musica, analisi e registrazioni.
Grazie alle API e la loro semplicità di utilizzo è possibile utilizzare il microfono in applicazioni XNA, ma anche in Silverlight, con un approccio misto che rientra tra le poche eccezioni consentite dalle policy di Microsoft. Come per tutte le tecnologie simili dedicate alla registrazione audio, il flusso arriva in buffer di byte che giungono attraverso un evento, nel quale è possibile salvare il buffer, elaborarlo oppure riprodurlo.
Tutto questo è possibile grazie alla classe Microphone, del namespace Microsoft.Xna.Framework.Audio, che cattura l'audio in un unico canale a 16bit. Questo significa che al secondo otteniamo 32000 byte e occorre perciò istruire il microfono di passarci il buffer ad intervalli regolari. Questo si traduce, una volta istanziata la classe e intercettato l'evento BufferReady, nell'impostare la proprietà BufferDuration con il tempo da catturare per ogni sample.
// Preparo il microfono microphone = Microphone.Default; microphone.BufferReady += microphone_BufferReady; // Durata del buffer microphone.BufferDuration = TimeSpan.FromMilliseconds(200); // Dimensiono il buffer in base alla dimensione int size = microphone.GetSampleSizeInBytes(microphone.BufferDuration); this.buffer = new byte[size];
Tramite questa durata si determina la dimensione del buffer, creando l'array che conterrà i byte. Poiché si hanno cinque campionature al secondo (32000 * 0.2) il buffer è di 6400 byte. La valorizzazione del BufferDuration è importante perché calibra il ritardo, l'utilizzo della CPU e della memoria nella fase di registrazione. Piccole campionature diminuiscono il ritardo e la memoria usata, ma intensificano l'uso della CPU. Campionature più lunghe aumentano il ritardo e la memoria usata, ma alleggeriscono la CPU. I 200 millisecondi proposti sono stati scelti in questo script come un valore medio appropriato per riprodurre quasi immediatamente la registrazione tramite l'output audio del dispositivo.
Per riprodurre l'audio si procede quindi, oltre alla preparazione del microfono, alla creazione della classe DynamicSoundEffectInstance che grazie al sample rate e al numero di canale resta in attesa di buffer audio da riprodurre.
// Attivo l'uscita audio in base alle caratteristiche dell'input this.dynamicSoundEffectInstance = new DynamicSoundEffectInstance(microphone.SampleRate, AudioChannels.Mono); this.dynamicSoundEffectInstance.Play(); // Avvio la registrazione this.microphone.Start();
A questo punto non serve fare altro che riempire il buffer dal microfono non appena scatta l'evento BufferReady per poi redirigere l'array alla periferica di output con il metodo SubmitBuffer.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare un service principal per accedere a Azure Container Registry
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Short-circuiting della Pipeline in ASP.NET Core
Reactive form tipizzati con FormBuilder in Angular
Usare un KeyedService di default in ASP.NET Core 8
Code scanning e advanced security con Azure DevOps
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Criptare la comunicazione con mTLS in Azure Container Apps
Usare lo spread operator con i collection initializer in C#
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Hosting di componenti WebAssembly in un'applicazione Blazor static
I più letti di oggi
- Operazioni di selezione su una DataTable
- annunciato #windowsazure pack: consente di far girare su #windowsserver 2012 e system center on premise i servizi di azure! #msteched
- Aggiungere servizi esterni al ciclo di vita di un'applicazione Silverlight 4.0
- Inviare notifiche toast da background agent con Windows Phone 7.1