?? buffer.cpp
字號:
intBufferList::add_rambuffer(){ add_buffer(new RAMBuffer()); return 0;}voidBufferList::add_buffer(AudioBuffer *buf){ if (count) buffers = (AudioBuffer**)realloc (buffers,sizeof(AudioBuffer*)*(count+1)); else buffers = (AudioBuffer**)malloc(sizeof(AudioBuffer*)); buffers[count] = buf; listbox->insertItem("*",count); listbox->setCurrentItem(count); label_buffer(count); count++;}voidBufferList::label_buffer(int buf){ struct SOUNDPARAMS *p; int sec,len,size; char text[256]; p = buffers[buf]->get_params(); if (p->format != FMT_UNDEFINED) { size = buffers[buf]->get_size(); sec = size/p->rate/p->channels; if (p->format == FMT_16BIT) sec /= 2; len = sprintf(text,"%5d %s %s %d:%02d / ", p->rate, (p->channels == 1) ? (const char*) i18n("mono") : (const char*) i18n("stereo"), sndfmt2str(p->format), sec/60,sec%60); if (size>>20) len += sprintf(text+len,"%d.%dMB ", size>>20,((size&0xfffff)*10)>>20); else len += sprintf(text+len,"%dkB ",size>>10); } else { strcpy(text,i18n("new")); strcat(text," "); } strcat(text,buffers[buf]->name()); if (p->format != FMT_UNDEFINED && buffers[buf]->clippedsamples) { sprintf(text+strlen(text)," (%2d samples clipped)", buffers[buf]->clippedsamples); } listbox->changeItem(text,buf);} voidBufferList::del_buffer(int buf){ int i; if (buffers[buf]->is_busy()) { KMessageBox::error(NULL, i18n("buffer is busy")); return; } listbox->removeItem(buf); delete buffers[buf]; for (i = buf+1; i < count; i++) buffers[i-1] = buffers[i]; count--; if (0 == count) free(buffers);}voidBufferList::new_params(struct SOUNDPARAMS *p){ memcpy(¶ms,p,sizeof(struct SOUNDPARAMS));}voidBufferList::new_data(void *data){ static int count; int i,j,max; unsigned char *c; short *s; int clippedhere=0; if (wait) { if (params.format == FMT_16BIT) { for (i = (params.blocksize>>1)-1, s=(short*)data, max = 0; i; i--) if (abs(s[i]) > max) max = abs(s[i]); max = max * 100 / 32768; } else { for (i = params.blocksize-1, c=(unsigned char*)data, max = 0; i; i--) if ((j = abs((int)c[i]-128)) > max) max = j; max = max * 100 / 128; } if (max >= level) { wait = 0; emit status(i18n("record")); } else return; } /* we're here if we're not waiting */ /* we have to check for possible clipping */ if (params.format == FMT_16BIT) { for (i = (params.blocksize>>1)-1, s=(short*)data, max = 0; i; i--) if ((s[i]==32767) || (s[i]==-32768)) { //fprintf(stderr,"!"); clippedhere++; } max = max * 100 / 32768; } else { for (i = params.blocksize-1, c=(unsigned char*)data, max = 0; i; i--) { j = abs((int)c[i]-128); if ((j==127) || (j==-128)) { //fprintf(stderr,"!"); clippedhere++; } } max = max * 100 / 128; } //fprintf(stderr,"%d\n",clippedhere); if (-1 != brecord) { buffers[brecord]->clippedsamples += clippedhere; if (-1 == buffers[brecord]->write_audio(params.blocksize,data)) { istop(); xperror(i18n("can't save sound data")); } if (++count == 16) { count = 0; label_buffer(brecord); set_pos_size(i18n("record"),brecord); } }}voidBufferList::post_data(void *data){ static int count = 0; void *ptr; if (NULL == (ptr = buffers[bplayback]->read_audio(params.blocksize))) { memset(data,0,params.blocksize); istop(); //fprintf(stderr,"->EOF"); return; } memcpy(data,ptr,params.blocksize); if (++count == 16) { count = 0; set_pos_size(i18n("playback"),bplayback); }}voidBufferList::set_pos_size(const char *start, int buf){ struct SOUNDPARAMS *p; int sec,len,size; char text[256]; p = buffers[buf]->get_params(); size = buffers[buf]->tell(); sec = size/p->rate/p->channels; if (p->format == FMT_16BIT) sec /= 2; len = sprintf(text,"%s %d:%02d / ",start,sec/60,sec%60); size = buffers[buf]->get_size(); sec = size/p->rate/p->channels; if (p->format == FMT_16BIT) sec /= 2; sprintf(text+len,"%d:%02d",sec/60,sec%60); emit status(text);}/* ---------------------------------------------------------------------- */voidBufferList::new_ram(){ add_rambuffer();}voidBufferList::save_buf(const char *filename){ int i; void *data; struct SOUNDPARAMS *p; FileBuffer fbuf; if (-1 == (i = listbox->currentItem())) return; if (buffers[i]->is_busy()) { KMessageBox::error(NULL, i18n("buffer is busy")); return; } p = buffers[i]->get_params(); buffers[i]->seek(0); if (-1 == fbuf.attach(filename)) return; fbuf.start_write(p); while (NULL != (data = buffers[i]->read_audio(p->blocksize))) { if (-1 == fbuf.write_audio(p->blocksize,data)) { xperror(i18n("can't write sound data")); break; } } fbuf.stop_write();}voidBufferList::del_buf(){ int i; if (-1 != (i = listbox->currentItem())) del_buffer(i);}voidBufferList::monitor(){ mon = !mon; if (mon) { if (-1 == card->start_record()) { xperror(i18n("can't open soundcard")); return; } emit status(i18n("monitor")); } else { if (-1 == brecord) { card->stop(); emit status(i18n("idle")); } }}voidBufferList::set_level(int l){ level = l;}voidBufferList::record(){ if (-1 != bplayback || -1 != brecord) stop(); if (-1 == (brecord = listbox->currentItem())) { add_rambuffer(); brecord = count-1; } if (buffers[brecord]->is_busy()) { KMessageBox::error(NULL, i18n("buffer is busy")); brecord = -1; return; } if (-1 == card->start_record()) { xperror(i18n("can't open soundcard")); brecord = -1; return; } buffers[brecord]->balloc(); buffers[brecord]->start_write(¶ms); buffers[brecord]->seek(0); label_buffer(brecord); if (level) { wait = 1; emit status(i18n("waiting...")); } else { wait = 0; emit status(i18n("recording...")); }}voidBufferList::play(){ struct SOUNDPARAMS *p; if (-1 != bplayback || -1 != brecord) stop(); if (-1 == (bplayback = listbox->currentItem())) { /* error message ?? */ bplayback = -1; return; } if (buffers[bplayback]->is_busy()) { KMessageBox::error(NULL, i18n("buffer is busy")); bplayback = -1; return; } p = buffers[bplayback]->get_params(); card->setparams(p); if (-1 == card->start_playback()) { xperror(i18n("can't open soundcard")); bplayback = -1; return; } buffers[bplayback]->balloc(); buffers[bplayback]->seek(0); emit status(i18n("playback"));}#define JUMP_SECONDS 20voidBufferList::forward(){ struct SOUNDPARAMS *p; int pos; if(-1 != bplayback) { p = buffers[bplayback]->get_params(); pos = buffers[bplayback]->tell(); pos += (JUMP_SECONDS * p->rate * p->channels * ((p->format == FMT_16BIT) ? 2 : 1)) & ~(2^14-1); buffers[bplayback]->seek(pos); card->kill_buffer(); }}void BufferList::backward(){ struct SOUNDPARAMS *p; int pos; if(-1 != bplayback) { p = buffers[bplayback]->get_params(); pos = buffers[bplayback]->tell(); pos -= (JUMP_SECONDS * p->rate * p->channels * ((p->format == FMT_16BIT) ? 2 : 1)) & ~(2^14-1); if (pos < 0) pos = 0; buffers[bplayback]->seek(pos); card->kill_buffer(); }}voidBufferList::istop(){ if (-1 != brecord) { buffers[brecord]->stop_write(); label_buffer(brecord); buffers[brecord]->bfree(); brecord = -1; if (!mon) { card->stop(); emit status(i18n("idle")); } else { emit status(i18n("monitor")); } } if (-1 != bplayback) { buffers[bplayback]->bfree(); bplayback = -1; if (mon) { card->start_record(); emit status(i18n("monitor")); } else { card->stop(); emit status(i18n("idle")); } }}voidBufferList::stop(){ if (-1 != bplayback) { /* stop *button*, we kill the output buffer */ card->kill_buffer(); } istop();}voidBufferList::next_buffer(){ char filename[256]; if (-1 != bplayback) { listbox->setCurrentItem(bplayback+1); stop(); play(); } else if (-1 != brecord) { istop(); sprintf(filename,"song%03d.wav",new_buffer_count++); add_filebuffer(filename); record(); } else { sprintf(filename,"song%03d.wav",new_buffer_count++); add_filebuffer(filename); record(); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -