Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Audio player won't work with structure error when running callback

Asked by Lawson Hoover on 12 Dec 2012

Ok, so I have looked at other problems concerning this error and none of them apply to mine. I am trying to include a simple music player into my program in MATLAB, but every time I try to run it I get the error:

   Attempt to reference field of non-structure array.
   Error in Beam_Deflection_GUI_3_Music>Play_Music_Call (line 388)
   n = get(S.listMusic,'Value');
   Error while evaluating uicontrol Callback

I have now figured out that somehow I am turning the S structure into a double, but I do not know how I am doing that, or even how one would go about doing that. If it would help here is the code:

MusicChoice = {'Message in A Bottle','Roxanne'};
S.Pa4 = uipanel('title','Music',...            
          'FontSize',12,...
          'BackgroundColor','white',...
          'Units','pixels',...
          'Position',[25 80 280 425],...
          'Parent',S.fh,...
          'fontweight','b',...
          'FontAngle','italic',...
          'visible','off');
S.listMusic = uicontrol('parent',S.Pa4,...
    'style','popupmenu',...
    'String',MusicChoice);
S.Play = uicontrol('parent',S.Pa4,...
    'style','push',...
    'string','Play',...
    'units','pix',...
    'pos',[100 100 20 20],...
    'callback',@Play_Music_Call);
   function [] = Play_Music_Call(varargin) 
       S = varargin{1};
       n = get(S.listMusic,'Value');
       MusicChoice = {'Message in A Bottle','Roxanne'};
       mChoice = MusicChoice(n,1);
       [y, Fs, nbits] = wavread(mChoice);
       S.player = audioplayer(y, Fs, nbits);
       play(S.player)
   end 

0 Comments

Lawson Hoover

Products

No products are associated with this question.

1 Answer

Answer by Walter Roberson on 12 Dec 2012
Accepted answer

When you have a callback, two arguments are always passed to it: source, and event. Source is the handle of the object that generated the callback, and event has details about the event that was triggered. No other arguments are passed by default: any other arguments must be passed explicitly. When you are using GUIDE, GUIDE generates the callback to not name a routine directly and instead to execute code that finds the "handles" structure and pass it as a third argument to the callback routine.

Thus, varargin{1} in your routine is the handle to the uicontrol (same as S.play). handles are datatype "double".

It looks to me as if Play_Music_Call is possibly a nested function. If it is not nested at the moment, you could convert it to nested by adding an "end" after the Play_Music_Call definition

   function  Beam_Deflection_GUI_3_Music
     [....]
     function Play_Music_Call
       [...]
     end
   end

Once it is nested, then remove the assignment to S in Play_Music_Call, and then that routine will have access to the values assigned to S in Beam_Deflection_GUI_3_Music

1 Comment

Lawson Hoover on 12 Dec 2012

Thank you so much!

Walter Roberson

Contact us