JavascriptProva

Visualizzazione post con etichetta Buffer. Mostra tutti i post
Visualizzazione post con etichetta Buffer. Mostra tutti i post

lunedì 14 marzo 2016

audioRecorder, primi rudimenti.

Mi preparo tutte le impostazioni relative al tipo di segnale digitale, e dichiaro la variabile per l'audioRecorder e per il Thread (è ovvio che la registrazione va su un thread separato altrimenti si impappa tutto),
Poi ho due metodi: startRecording, che istanzia un audioRecorder e lo avvia sul thread suo leggendo i dati che arrivano dal microfono (o altra fonte) nel buffer; e stopRecording che stoppa il loop della registrazione, ferma l'audioRecorder e me lo distrugge.

Ecco le dichiarazioni:
 private Thread recordingThread=null;
 boolean isRecording;
 Button button1;
 
 int audioSource=AudioSource.MIC;
 int sampleRate=8000;
 int channelConfig=AudioFormat.CHANNEL_IN_MONO;
 int audioFormat=AudioFormat.ENCODING_PCM_16BIT;
 int bufferSizeInBytes=AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
 AudioRecord audioRecord;
 byte[] buffer=new byte[bufferSizeInBytes];
E il codice che attribuisce il listener al bottone che avvia e stoppa la registrazione:
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  button1=(Button)findViewById(R.id.button1);
  button1.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    if(isRecording){
     ((Button)v).setText("Stop recording");
     stopRecording();
    }
    else{
     ((Button)v).setText("Start recording");
     startRecording();
    }
    
    
   }
  });


Poi il codice che crea e quello che distrugge l'audioRecorder:
La prima funzione è startRecording:
 public void startRecording(){
  isRecording=true;
  audioRecord=new AudioRecord(audioSource,sampleRate,channelConfig,audioFormat,bufferSizeInBytes);
  recordingThread=new Thread(new Runnable(){

   @Override
   public void run() {
    while(isRecording){
     audioRecord.read(buffer,0,bufferSizeInBytes);
    }
    
   }
   
  });
  
 }


E l'altra è stopRecording:
 public void stopRecording(){
  isRecording=false;
  audioRecord.stop();
  audioRecord.release();
  audioRecord=null; 
 }
E pare che funzioni.
Ovviamente non lo posso testare perché mi manca ancora uno strumento con funzioni di player...
Comunque perlomeno non si blocca, ed è già qualcosa.

giovedì 10 ottobre 2013

Lettura in un buffer di un file wav mediante il metodo Read

Ecco, con questo codice leggo una parte di un file WAV. E ottengo la conferma che si tratta di un file WAV in quanto ne riconosco l'header:
Imports System.IO
Module Module1
    Dim corrente As New FileStream("c:\users\antonello\desktop\voce.wav", FileMode.Open)

    Dim destinazione(&H100) As Byte
    Sub Main()
        
        corrente.Read(destinazione, 0, destinazione.Length)

        For n = 0 To destinazione.Length - 1
            Console.Write(Chr(destinazione(n)))
        Next

        Console.ReadKey()
    End Sub

End Module
RIFFD☻☺ WAVEfmt ►   ☺ ☺ ◄+  ◄+  ☺ data ☻☺ ????⌂???????????????????⌂??????????⌂⌂⌂
????⌂???????????????????⌂??⌂???????⌂???⌂?⌂?????⌂??????⌂????????⌂⌂???????????⌂???
????????????⌂????⌂⌂???⌂?⌂???⌂??????????????????????????????????⌂???????????⌂???⌂
⌂????⌂??????⌂⌂?


lunedì 30 settembre 2013

Inizio a usare DirectSound.

Procediamo, come al solito con linquaggio da ignorante, a cercare di capire qualcosa su come si usa DirectSound.

Dunque, io creo un Device. Non ho ancora capito bene che accidenti sia, ma lo creo ugualmente, toh!

Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectSound
Public Class Form1
    Dim _dev As Device
    Dim _buffer As SecondaryBuffer
Eccolo dichiarato.
Dichiaro anche un buffer.

Vediamo come si istanzia questo Device.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        _dev = New Device
        _dev.SetCooperativeLevel(Me.Handle, CooperativeLevel.Priority)
Semplicemente con New Device. Il costruttore del Device non ha parametri.

Bene, ora che abbiamo dato vita a un Device, impostiamo il Cooperative Level.
Che accidenti è, per la precisione, questo Cooperative Level?

Credo che abbia a che fare con le altre applicazioni, ossia con la competizione con altre applicazioni per qualcosa, come le periferiche... ma non ne sono molto sicuro.

In ogni caso, sintetizziamo e andiamo avanti: Si dichiara e si istanzia un Device, che ha un semplice costruttore senza parametri, e quindi si imposta il Cooperative Level del Device stesso.
Quindi, dichiarato il buffer, si istanzia. Questo ha nel costruttore due parametri, uno che specifica il file, e l'altro che specifica il Device.
Forse si tratta di un discorso del tipo: "Creo un buffer nel quale immagazzino i dati del file e lo associo al tale Device.

Bene... con un linguaggio da caprone inizio a capire la cosa. Poi con calma cercherò di affinare sia la comprensione sia il linguaggio.
Se aspetto di comprendere tutto, non vado più avanti.