Bool echo_done; U0 (*fp_task_end_cb)(); U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; U0 (*fp_old_copy_buf)(SND_IN_CONTAINER *buf,I64 buf_num)=NULL; #define NUM_BUF 8 SND_IN_CONTAINER my_buf[SND_BUF_LEN*NUM_BUF]; I64 my_ibuf_ptr,my_obuf_ptr; U0 EchoFillBuf(SND_OUT_CONTAINER *buf,I64) { I64 j; if (echo_done) return; j=0; while (jistr0_buf[0]; I64 i,x1,y1,x2=0,y2=0, cy=task->win_pixel_height>>1; dc->color=BLUE; for (i=0;iwin_pixel_width/SND_BUF_LEN; y1=cy-buf[i]*cy/MAX_I16; GrLine(dc,x2,y2,x1,y1); x2=x1; y2=y1; } } U0 EchoDemo() { if (snd_dev!=SD_HD_AUDIO) { "Only works for HD Audio.\n"; return; } SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ HDRun(TRUE,TRUE); echo_done=FALSE; fp_task_end_cb=Fs->task_end_cb; Fs->task_end_cb=&EchoTaskEndCB; //Catch or Kill() task my_ibuf_ptr=(NUM_BUF/2)*SND_BUF_LEN; my_obuf_ptr=0; fp_old_fill_buf=fp_snd_fill_buf; fp_old_copy_buf=fp_snd_copy_buf; fp_snd_fill_buf=&EchoFillBuf; fp_snd_copy_buf=&EchoCopyBuf; DocCursor; DocClear; Fs->draw_it=&DrawIt; try GetChar; catch { //Catch , but pass it on to next higher handler. fp_snd_fill_buf=fp_old_fill_buf; fp_snd_copy_buf=fp_old_copy_buf; Fs->task_end_cb=fp_task_end_cb; } echo_done=TRUE; HDStop(TRUE,FALSE); fp_snd_fill_buf=fp_old_fill_buf; fp_snd_copy_buf=fp_old_copy_buf; Fs->task_end_cb=fp_task_end_cb; SettingsPop; } EchoDemo;