Verfasst am: 20.04.2016, 11:01
Titel: Speicherproblem beim abbrechen einer For-Schleife
Hallo liebes Forum!
Aktuell habe ich folgendes Problem:
Ich habe ein Player programmiert, mit dem ich ein Signal abspielen aber auch beim Abspielen unterbrechen möchte. Beides wird über einen Pushbutton realisiert. Wenn ich den Pushbutton zum abspielen tätige, dann funktioniert alles problemlos. Sobald ich aber über den gleichen Pushbutton das Signal abbrechen möchte wird mir eine Fehlermeldung ausgegeben, die besagt, dass der Arbeitsspeicher voll ist. Ich weiß gerade nicht wo ich ansetzen soll, um den Fehler zu beheben. Vielleicht kann mir jemand weiterhelfen.
Im Folgenden der Code:
Code:
% Pushbutton Play/Stop
% --- Executes on button press in pushbutton_start. function pushbutton_start_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_start (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% global variable global Duration ListValue Counter
global speakerIndex stimulusFileName
global ChanCorr OutChannels DeviceID
global BasePath filePath
global calibrationLevel stimulusLevel
global SampleRate
global BitSize
global Startbutton
if Startbutton == 0 set(handles.pushbutton_start, 'String', 'Stop');
Startbutton = 1;
else set(handles.pushbutton_start, 'String', 'Start');
Startbutton = 0;
end
% First generate a Signal File ifisempty(Counter) == 1
Counter = 1;
% generate stimulusFileName for wavwrite
stimulusFileName = 'Signal.wav';
% generate filePath for play wavfile
filePath = strcat(BasePath, filesep, stimulusFileName);
end
% Get the correct Signal [GetSignal_Status Signal] = getSignal(Duration, ListValue);
% Query, if everything is in order. It will only continue to run if there % is no error! if GetSignal_Status == 1 % Write Wavfile wavwrite(Signal,SampleRate,BitSize,stimulusFileName);
% Present Signal
presentCalibSignal(filePath, speakerIndex, calibrationLevel, stimulusLevel, ChanCorr, OutChannels, DeviceID) set(handles.pushbutton_start, 'String', 'Start');
end
%% Warning for distortion if dBFS_before<dBFS_after || dBFS_MAX>0
msgDistortion = errordlg('Die Amplitude des Signals ist größer als im Originalzustand! Aus Sicherheitsgründen wird das Signal nicht abgespielt', 'ACHTUNG', 'modal');
uiwait(msgDistortion);
dBFS_before
dBFS_after
dBFS_MAX
else
NrofSamples = size(y,1);
% number of complete frames in signal
NrofBlocks = floor(NrofSamples/BlockLen);
%% Zero Padding % Number of missing samples
restBlockLen = mod(NrofSamples, BlockLen);
%% Create a Matrix with number of Samples and number of all Device-Channels
SignalMatrix = zeros(size(y,1), OutChannels);
%% Play Signal % Check for available output channels if speakerIndex+ChanCorr > OutChannels
msgString = ['Die ausgewählte Soundkarte verfügt nur über ', num2str(OutChannels),...
' Ausgangskanäle! Die Ansteuerung des Ausgangkanals ', num2str(speakerIndex+ChanCorr),...
' ist nicht möglich! Bitte passen Sie die Eingabe für Lautsprecher und ggf. in der ChanCorr.xls Datei an. Die Anwendung muss neu gestartet werden!'];
msgChannelError = errordlg(msgString, 'Fehler', 'modal');
uiwait(msgChannelError);
else % Paste Mono-signal into the correct column
SignalMatrix(:,speakerIndex+ChanCorr) = y;
% Open msound devices for reading and writing
msound('openWrite', DeviceID, SampleRate, BlockLen, OutChannels)
% try that to see some more info about what msound is doing % msound('verbose', 1)
for k=1:NrofBlocks
drawnow;
if Startbutton == 0
SignalMatrix = [];
break;
end % sample indices for next frame:
idx = (k-1)*BlockLen + (1:BlockLen);
msound('putSamples', SignalMatrix(idx,:));
end
Startbutton = 0;
Error in gui_mainfcn (line 96)
feval(varargin{:});
Error in SignalPlayer (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in
@(hObject,eventdata)SignalPlayer('pushbutton_start_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating uicontrol Callback
Frei87
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 20.04.2016, 11:35
Titel:
Ich habe den Fehler selbst gefunden. Und zwar habe ich den Callback-Code für den Pushbutton ungünstig geschrieben. In der alten Version ist Matlab den gesamten Code ab dem Callback durchgegangen und hat somit das doppelte an Daten angelegt (zumindest temporär). Der Callback-Code sollte aber so aussehen:
Code:
% Pushbutton Play/Stop
% global variable global Duration ListValue Counter
global speakerIndex stimulusFileName
global ChanCorr OutChannels DeviceID
global BasePath filePath
global calibrationLevel stimulusLevel
global SampleRate
global BitSize
global Startbutton
% First generate a Signal File ifisempty(Counter) == 1
Counter = 1;
% generate stimulusFileName for wavwrite
stimulusFileName = 'Signal.wav';
% generate filePath for play wavfile
filePath = strcat(BasePath, filesep, stimulusFileName);
end
if Startbutton == 0 set(handles.pushbutton_start, 'String', 'Stop');
Startbutton = 1;
% Get the correct Signal [GetSignal_Status Signal] = getSignal(Duration, ListValue);
% Query, if everything is in order. It will only continue to run if there % is no error! if GetSignal_Status == 1 % Write Wavfile wavwrite(Signal,SampleRate,BitSize,stimulusFileName);
% Present Signal
presentCalibSignal(filePath, speakerIndex, calibrationLevel, stimulusLevel, ChanCorr, OutChannels, DeviceID) set(handles.pushbutton_start, 'String', 'Start');
end else set(handles.pushbutton_start, 'String', 'Start');
Startbutton = 0;
end
Das heißt die Abspiel-Funktion (presentCalibSignal.m) sollte nur einmal aufgerufen werden und zwar wenn der Pushbutton zum Abspielen betätigt wurde. Beim Anhalten des Signals muss die Abspiel-Funktion (presentCalibSignal.m) nicht nochmal durchlaufen werden, was selbst erklärend ist.
Trotzdem vielen Dank für die Möglichkeit etwas zu posten
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.