Play e Stop registrazione audio con GUIDE

di il
4 risposte

Play e Stop registrazione audio con GUIDE

Salve a tutti ragazzi,
ho letto un po' in questa sezione per trovare qualcosa che possa aiutare la mia causa ma non ci sono riuscito e per questo sto scrivendo un nuovo argomento.
Sto provando ad apprendere qualche nozione di matlab per lo sviluppo di applicativi nel campo della crittoanalisi. Ho creato con GUIDE un'interfaccia molto semplice che permette (cliccando il tasto play) di iniziare una registrazione, un tasto stop per fermare la registrazione e automaticamente salvare con nome il file audio e successivamente riproduce il file audio appena registrato e disegna un grafico del segnale.
Il problema è il seguente: se registro 5 secondi o più vengono salvati solo 5 secondi di audio e il tutto viene eseguito correttamente. Aumentando il tempo sono vincolato sempre dal numero di secondi che passo in recordblocking perchè se dovessi registrare meno del tempo inserito (5 secondi in questo caso) registra, salva correttamente ma disegna e fa ascoltare l'audio precedente o comunque l'ultimo audio registrato correttamente (cioè quello di 5 secondi o più). Io sto cercando di modificare il tutto per poter registrare un tempo non stabilito in recordblocking ma che dipenda solo dall'utente (cliccando il tasto stop appena ha finito la registrazione) e poi eseguire tutto il resto, salvare ascoltare l'audio e disegnare il grafico.
Posto il codice con le callback dei due tasti e una funziona stoprecording che viene richiamata dalle due callback.

Qui inizio la registrazione ed è presente recordblocking con 5 secondi come tempo massimo di registrazione.
function inizioregistrazione_Callback(hObject, eventdata, handles)
 RecordStatus = get(hObject,'Value');
 runstr=get(hObject,'string');
 if RecordStatus == 1
    % start recording
    fs = 44100;
    obj = audiorecorder(fs, 16, 1);
    recordblocking(obj, 5);
    record(obj);
    y = getaudiodata(obj);
    clear obj
    save recording.mat y
 else
    % stop recording
    StopRecording(handles);
 end   
Qui abbiamo la callback del tasto per fermare la registrazione che richiama la funzione stoprecording
function fermareregistrazone_Callback(hObject, eventdata, handles)
 StopRecording(guidata(hObject));
Infine la funziona che si occupa di salvare il file audio, riprodurre il file appena registrato e disegnare il grafico
function StopRecording(handles)
    fs = 44100;
    load recording y;
    [filename, pathname] = uiputfile('*.wav', 'Save file name');
    cd (pathname);
    audiowrite(filename, y, fs);
    sound(y,fs);
    handles.x = y;
    handles.fs = fs;
    axes(handles.axes1);
    time = 0:1/fs:(length(handles.x)-1)/fs;
    plot(time,handles.x);
    title('Original Signal');
    axes(handles.axes2);
    specgram(handles.x, 1024, handles.fs);
    title('Encrypted Signal');
    %guidata(handles);
Ringrazio in anticipo per le vostre risposte.
Un saluto.

4 Risposte

  • Re: Play e Stop registrazione audio con GUIDE

    Perchè nella funzione "inizioregistrazione_Callback" chiami sia "recordblocking(obj, 5)" che "record(obj)"

    Perchè non chiamare solo "record(obj)" e modificare la callback "StopRecording" (che in realtà, nella tua implementazione, non ferma la nulla) in modo che chiami la funzione "stop(obj)" per fermare effettivamente la registrazione e salvare il file audio?
  • Re: Play e Stop registrazione audio con GUIDE

    ask_raf ha scritto:


    Perchè nella funzione "inizioregistrazione_Callback" chiami sia "recordblocking(obj, 5)" che "record(obj)"

    Perchè non chiamare solo "record(obj)" e modificare la callback "StopRecording" (che in realtà, nella tua implementazione, non ferma la nulla) in modo che chiami la funzione "stop(obj)" per fermare effettivamente la registrazione e salvare il file audio?
    Adesso che me lo fai notare hai proprio ragione, non ferma per niente la registrazione, la mia intenzione (aldilà dei nomi) era quella di avere una funzione "stoprecording" che facesse una cosa comune a più callback, cioè salvare e disegnare grafico.
    Comunque grazie per la risposta provo il tuo consiglio e aggiorno in caso di risoluzione del mio problema.
    Rettifico:
    ho provato a modificare togliendo recordblocking e mettendo solo record(obj)
    RecordStatus = get(hObject,'Value');
    runstr=get(hObject,'string');
        if RecordStatus == 1
            fs = 44100;
            obj = audiorecorder(fs, 16, 1);
            save recording.mat obj
            record(obj);
            y = getaudiodata(obj);
            clear obj
            save recording.mat y;
        else
        StopRecording(handles);
    end
    Gli errori sono i seguenti: Recorder is empty. Non appena clicco il pulsante per registrare
  • Re: Play e Stop registrazione audio con GUIDE

    A differenza di recordblocking, la funzione record "ritorna" il controllo al programma dal quale è stata invocata immediatamente.

    Di conseguenza, in base a quello che hai scritto nel codice, le funzioni:
    
    y = getaudiodata(obj);
    clear obj
    save recording.mat y
    
    vengono chiamate immediatamente dopo l'attivazione di record; questo spiega il motivo per il quale in y non è stato memorizzato nulla.

    Quello che puoi provare a fare è spostare le chiamate alle funzioni
    
    y = getaudiodata(obj);
    save recording.mat y;
    
    nella callback associata al pushbutton che ferma la registrazione.

    Nel codice che hai pubblicato non viene chiamata la funzione stop.

    Nella callback associata al pushbutton che ferma la registrazione, devi chiamare la funzione stop prima delle istruzioni per l'acquisizione del segnare (getaudiodata).

    Per "passare" l'"oggetto" obj tra una callback e l'altra, puoi usare la funzione guidata.
  • Re: Play e Stop registrazione audio con GUIDE

    Ok grazie sono riuscito a risolvere grazie alle tue dritte.
Devi accedere o registrarti per scrivere nel forum
4 risposte