2015-04-30 1 views
0

У меня есть 2 функции обратного вызова, один воспроизводит аудио, а другой останавливает звук.Кнопка воспроизведения/остановки

function Play_Callback(hObject, eventdata, handles) 

global path; 
global player; 
[Y, Fs] = audioread(path); 
player = audioplayer(Y,Fs); 
play(player); 
pause(max(size(Y))/Fs); 

function Stop_Callback(hObject, eventdata, handles) 

global player; 
stop(player); 

Проблема в том, что в обратном вызове воспроизведения, если я не помещаю паузу, ничего не играет. Причина в том, что после завершения обратного вызова переменная 'игрока' сбрасывается. Однако пауза дает возможность для звука работать, конечно. Вызов обратного вызова останавливается, т. Е. Звук останавливается. Однако пауза все равно будет продолжаться, когда трек будет остановлен.

Я хочу решение, которое позволяет мне использовать остальные функции, в то время как звук воспроизводится, и это не требует, чтобы пауза продолжалась даже после нажатия кнопки остановки.

Любые идеи?

EDIT, я попробовал другой подход, но все еще есть проблемы: Play обратного вызова

global path; 
[Y, Fs] = audioread(path); 
player = audioplayer(Y,Fs); 
guidata(handles.Play,player); 
play(player); 

Стоп обратного вызова

player = guidata(hObject); 
stop(player); 

Проблема заключается в том, что, когда я пытаюсь выбрать другую дорожку из uitable, Я получаю сообщение об ошибке на линии, которая разрешает другую кнопку

и погрешность составляет:

No appropriate method, property, or field getCandidatesByKey for class audioplayer. 

Любые идеи? Заранее спасибо!

ответ

0

Существует множество способов обмена данными между обратными вызовами. Один простой способ - сохранить переменную игрока в поле UserData объекта hObject. Для этого вам следует добавить свойство тега при создании кнопки воспроизведения. Это так же просто, как добавление пары пара значений, когда создается кнопка.

button = uicontrol(... 
    'Tag','play_button',... 
...); 

В Play_Callback после создания аудиоплеера вы должны добавить следующую строку для хранения переменной игрока.

hObject.UserData = player; 

В Stop_Callback вы можете получить эти данные обратно, используя

h = findobj('Tag','play_button'); 
player = h.UserData 

Вы можете найти другие способы обмена данными в документации на http://www.mathworks.com/help/matlab/creating_guis/share-data-among-callbacks.html

+0

, как я могу сделать первую часть ИЭ. где вы создаете кнопку ... но так как я использую руководство, я хочу установить этот тег в функции create. Как мне это сделать? –

+0

Щелкните правой кнопкой мыши на кнопке и выберите инспектора свойств. Вы должны уметь видеть тег как один из вариантов. – Navan

+0

Таким образом, в обратном вызове воспроизведения Im это делает: [Y, Fs] = audioread (path); player = аудиоплеер (Y, Fs); hObject.UserData = игрок; play (player); В обратном вызове stop Im делает следующее: h = findobj ('Play'); player = h.Данные пользователя; стоп (игрок); При попытке воспроизвести дорожку я получаю это предупреждение, и дорожка не воспроизводится: Предупреждение. Назначение поля Struct переопределяет значение с помощью класса «double». См. Примечания к выпуску MATLAB R14SP2, Назначение несущих переменных в виде структур Отображает предупреждение, для получения дополнительной информации. Что я делаю неправильно? тег кнопки воспроизведения - «Play». –