以下是具有良好同步性的解决方案。这很有效,因为audioplayer 对象正在启动更新播放头位置的回调。这是调用脚本。 . .
fs = 44100;
durT = 3; %seconds
durS = fs*durT; %samples
x = randn(durS, 1);
dt = 1/fs;
tAxis = dt:dt:durT;
frameRate = 25; %fps
frameT = 1/frameRate;
mag = 5;
figure;
plot(tAxis, x);
ylim([-mag mag])
xlim([0 durT])
xlabel('Time [s]')
playHeadLoc = 0;
hold on; ax = plot([playHeadLoc playHeadLoc], [-mag mag], 'r', 'LineWidth', 2);
player = audioplayer(x, fs);
myStruct.playHeadLoc = playHeadLoc;
myStruct.frameT = frameT;
myStruct.ax = ax;
set(player, 'UserData', myStruct);
set(player, 'TimerFcn', @apCallback);
set(player, 'TimerPeriod', frameT);
play(player);
...这是您可以存储在单独文件中的回调函数...
function src = apCallback(src, eventdata)
myStruct = get(src, 'UserData'); %//Unwrap
newPlayHeadLoc = ...
myStruct.playHeadLoc + ...
myStruct.frameT;
set(myStruct.ax, 'Xdata', [newPlayHeadLoc newPlayHeadLoc])
myStruct.playHeadLoc = newPlayHeadLoc;
set(src, 'UserData', myStruct); %//Rewrap
end
我刚刚将信号设为噪声样本,您可以随意替换它。遗憾的是,audioplayer 对象具有 stop 和 resume 方法,而无法访问当前播放头位置。幸运的是,有一个用户数据属性可以让您随意填写。