我为ipad编写了一个程序,它将midi文件处理成一个数组,然后我使用该数组使用循环播放该片段。
for (int j=pieceposition;j<100;j++){
xxx=midiplay[50][pieceposition];
int i=0;
while(midiplay[i][pieceposition]){
noteNum=midiplay[i][pieceposition];i++;
onVelocity=midiplay[i][pieceposition];i++;
MusicDeviceMIDIEvent(self.samplerUnit, noteOnCommand, noteNum,onVelocity, 0);
i++;}
pieceposition++;
usleep(xxx);
if(ENDLOOP){break;}
}
我的问题是我如何使用触摸屏的输入来阻止这个循环部分通过-将ENDLOOP从0更改为1?运行音频循环的线程似乎阻止任何触屏输入,直到循环完成。
您的问题在于您试图在主线程上进行播放,并且在播放期间,您正在使主线程睡眠。主线程负责UI,触摸屏和设备之间的所有交互都通过主线程处理。因此,如果主线程被任何进程使用(或休眠),UI将变得无响应。
在我看来,您可以使用大中央调度(gcd)将您的播放代码发送到后台线程。这确保主线程可以自由地响应任何触摸事件。您可以使用以下代码来实现:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int j=pieceposition;j<100;j++){
xxx=midiplay[50][pieceposition];
int i=0;
while(midiplay[i][pieceposition]){
noteNum=midiplay[i][pieceposition];i++;
onVelocity=midiplay[i][pieceposition];i++;
MusicDeviceMIDIEvent(self.samplerUnit, noteOnCommand, noteNum,onVelocity, 0);
i++;}
pieceposition++;
usleep(xxx);
if(ENDLOOP){break;}
}
});
我完全使用了你的代码,除了把它放在调度语句中,以便它将由后台线程执行。