# PsychPortAudio full duplex mode working with limited success

**URL:** <https://psychtoolbox.discourse.group/t/psychportaudio-full-duplex-mode-working-with-limited-success/660>\
**Category:** Uncategorized\
**Created:** [December 26, 2018, 7:24pm UTC](https://psychtoolbox.discourse.group/t/psychportaudio-full-duplex-mode-working-with-limited-success/660 "2018-12-26T19:24:33Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![dmanormail](https://avatars.discourse-cdn.com/v4/letter/d/74df32/32.png) [@dmanormail](https://psychtoolbox.discourse.group/u/dmanormail)\
**Post date:** [December 26, 2018, 7:24pm UTC](https://psychtoolbox.discourse.group/t/psychportaudio-full-duplex-mode-working-with-limited-success/660/1 "2018-12-26T19:24:33Z")

</div>

Hello Mario,

I'm trying to use PsychPortAudio's full duplex mode, unfortunately with limited success.

&nbsp;

I'm able to playback and record simultaneously but not exactly as I expect.

The code below should playback an audio file, wait for a vocal response and record it. The vocal response should occur during or after the playback.

&nbsp;

However, in practice, the vocal response is recorded only if it takes place during the playback but not if it's already finished, and the output recording contains everything from the playback start time and not from the vocal response start time.

&nbsp;

I attach my code, based on the toolbox demos.

I use Roland Cakewalk UA-4FX external USB sound card on Win7 64bit/Matlab R2017a/PTB 3.0.14.

&nbsp;

I would be much grateful for any advice.

Thanks,

Dan

&nbsp;

&nbsp;

function&nbsp;myAudioTask

&nbsp;

&nbsp;

InitializePsychSound(1);

freq = 44100;

myfile =&nbsp;'../sounds/myfile.wav';

&nbsp;

try

&nbsp;&nbsp;&nbsp; pahandle = PsychPortAudio('Open', [], 3, 1, freq, [2, 1]);

&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;t = 1 : 3

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp('start trial');

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% % preallocate recording buffer

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PsychPortAudio('GetAudioData', pahandle, 10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wavdata = audioread(myfile);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wavdata = [wavdata(:,1) wavdata(:,1)];% 2 channels

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PsychPortAudio('FillBuffer', pahandle, wavdata');&nbsp;% loads data into buffer

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; audio\_onset = PsychPortAudio('Start', pahandle,1,0,1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disp('start playback');

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = 0;&nbsp;% init

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; triggerlevel = 0.01;&nbsp;% init

&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% Repeat as long as below trigger-threshold (within max time)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;level \< triggerlevel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% Fetch current audiodata:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; audiodata = PsychPortAudio('GetAudioData', pahandle);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; predata = audiodata;&nbsp;% save the last buffer

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% Compute maximum signal amplitude in this chunk of data:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;~isempty(audiodata)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; level = max(abs(audiodata(1,:)));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; level = 0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% if exceeded trial time then go to next trial

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetSecs - audio\_onset \> 6

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StopAudioRecord(pahandle);&nbsp;% stop recording and empty buffer

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% Below trigger-threshold?

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;level \< triggerlevel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WaitSecs(0.005);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;% while

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% Ok, last fetched chunk was above threshold!

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt = GetSecs - audio\_onset;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disp(num2str(rt));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordedaudio = predata;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;% record a few more seconds

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; starttime = GetSecs;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;GetSecs - starttime \< 5

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; audiodata = PsychPortAudio('GetAudioData', pahandle);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordedaudio = [recordedaudio audiodata];&nbsp;% add to audio vector

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StopAudioRecord(pahandle);&nbsp;% stop recording and empty buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wavfile = sprintf('../soundfile%.3d.wav',t);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; audiowrite(wavfile, transpose(recordedaudio), freq);

&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;

catch&nbsp;ME

&nbsp;&nbsp;&nbsp; fclose('all');

&nbsp;&nbsp;&nbsp;&nbsp;% Close the audio device:

&nbsp;&nbsp;&nbsp; PsychPortAudio('Close');

&nbsp;&nbsp;&nbsp; rethrow(ME);

end

fclose('all');

% Close the audio device:

PsychPortAudio('Close');

end

&nbsp;

%==========================================================================

&nbsp;

function&nbsp;StopAudioRecord(phand)

% Stop sound capture:

PsychPortAudio('Stop', phand);

% empty before next trial:

PsychPortAudio('GetAudioData', phand);

end

&nbsp;

%==========================================================================
