-首先你必须知道你在回调函数中定义的变量没有被存储,这就是你的按钮 3 不起作用的原因。
-您是否尝试过在对 GUI 进行编程之前直接运行音频文件以检查它是否有效?
-关于您正在尝试做的事情的几个提示:
1) 如果不想手动选择文件,只需设置:
filename='.wav 文件的完整路径';
2) 如果你有 FileName 和 PathName,要构造包含完整路径的字符串,你可以这样做:
FullPath=strcat(PathName,FileName);
3) 按钮 1 和按钮 2 是什么类型的按钮?如果只是为了选择一个文件,为什么需要按钮。我建议:
- 单选按钮:在这种情况下会更加直观,而且您可以在 Button3_Callback 中以编程方式获取它们的状态以读取正确的 .wav
- ListBox :如果您计划能够轻松添加读取更多 .wav 文件而无需更改 GUI 的可能性,这很有用。
4)关于你的最后一个问题,这又是由于回调之间没有传输变量,所以在你的 Button4_Callback 中,Matlab 不知道变量'player'。
当您回答我的问题时,我会发布更多详细信息^^
编辑 - 关于您的评论:
a) 你不应该使用 `function uipanel1_SelectionChangeFcn(hObject, eventdata, handles)' 来调用你的代码,因为你可以通过点击 Button3 来做任何事情。 (function Button3_Callback(hObject,eventdata,handles))
b) 我建议您为您的 GUI 元素提供自定义名称(在属性编辑器中更改 Tag 属性),例如 Button3 将是“播放”或类似的名称。 (想象一个带有 35 个按钮、25 个编辑字段等的 GUI,你很快就会迷失方向)
c) Button3_Callback 看起来像:
%Know which radiobutton is selected
Value_radiobutton1=get(handles.radiobutton1,'value'); %Returns 1 if radiobutton1 is checked, 0 if not
Value_radiobutton2=get(handles.radiobutton2,'value'); %Same as above but for radiobutton2
%Now that you have the information :
if(Value_radiobutton1)
% play first .wav
FullPath='C:\Users\Y400\Documents\MATLAB\test1';
[x,Fs]=wavread(FullPath);
handles.myPlayer = audioplayer(x,Fs);
play(handles.myPlayer);
else
% play second.wav
end
%store your handles again to keep track of your audioplayer.
guiData(hObject,handles);
请注意,一旦回调停止执行,音频文件就会停止播放,因此您必须在此处使用一些小技巧,例如:
http://www.mathworks.com/matlabcentral/newsreader/view_thread/328757
另请注意,执行回调后,您的播放器变量将被删除,因此您将无法再访问它。我建议您将其句柄存储在 handles 对象中。例如,这可以在 guidata(hObject,handles) 之前的 GUI 的打开功能中通过添加类似的内容来完成:
handles.myPlayer=[];
然后在 Button3_Callback 函数中覆盖它
而不是写:player=audioplayer[x,Fs]
你去:handles.myPlayer=audioplayer[x,Fs]
然后,您可以访问它来暂停/停止音频。
现在你仍然必须:
- 想办法让音乐停止播放(点击按钮?播放按钮相同?)
- 防止用户同时选中两个单选按钮
- 防止用户在未选中单选按钮的情况下按下按钮 3
(可以禁用 button3 直到选中单选按钮,或者默认选中其中一个单选按钮,由您选择)。