⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.cpp

📁 一个KDE下的录音程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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(&params,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(&params);    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 + -