运行音频线程阻止触摸屏输入,直到它完成



我为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;} 
    }
});

我完全使用了你的代码,除了把它放在调度语句中,以便它将由后台线程执行。

最新更新