[xiph-cvs] cvs commit: postfish form.c form.h postfish.c
Monty
xiphmont at xiph.org
Sun Dec 1 00:34:40 PST 2002
xiphmont 02/12/01 03:34:40
Modified: . form.c form.h postfish.c
Log:
Add wideband gate/eq manipulation
Revision Changes Path
1.4 +8 -8 postfish/form.c
Index: form.c
===================================================================
RCS file: /usr/local/cvsroot/postfish/form.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- form.c 1 Dec 2002 06:30:17 -0000 1.3
+++ form.c 1 Dec 2002 08:34:40 -0000 1.4
@@ -197,14 +197,14 @@
if(focus)cursor_active=0;
}
break;
- default:
+ case FORM_DB:
{
char buf[80];
if(f->active){
- if(f->dpoint)
+ if(f->dpoint==1)
snprintf(buf,80,"%+*.1f",f->width,lval*.1);
else
- snprintf(buf,80,"%+*ld",f->width,lval);
+ snprintf(buf,80,"%+*ld",f->width,(long)(lval*.1));
addstr(buf);
}else
for(i=0;i<f->width;i++)addch('-');
@@ -240,7 +240,7 @@
f->fields[n].width=width;
f->fields[n].var=var;
f->fields[n].cb=cb;
- f->fields[n].dpoint=d;
+ f->fields[n].dpoint=(d?1:10);
f->fields[n].active=1;
f->fields[n].min=min;
@@ -435,22 +435,22 @@
long *val=(long *)ff->var;
switch(c){
case '=':
- (*val)++;
+ (*val)+=ff->dpoint;
if(*val>ff->max)*val=ff->max;
if(ff->cb)ff->cb();
break;
case '+':
- (*val)+=10;
+ (*val)+=ff->dpoint*10;
if(*val>ff->max)*val=ff->max;
if(ff->cb)ff->cb();
break;
case '-':
- (*val)--;
+ (*val)-=ff->dpoint;
if(*val<ff->min)*val=ff->min;
if(ff->cb)ff->cb();
break;
case '_':
- (*val)-=10;
+ (*val)-=ff->dpoint*10;
if(*val<ff->min)*val=ff->min;
if(ff->cb)ff->cb();
break;
<p><p>1.3 +1 -0 postfish/form.h
Index: form.h
===================================================================
RCS file: /usr/local/cvsroot/postfish/form.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- form.h 1 Dec 2002 06:30:17 -0000 1.2
+++ form.h 1 Dec 2002 08:34:40 -0000 1.3
@@ -51,6 +51,7 @@
int editable;
} form;
+extern int pgetch(void);
extern void form_init(form *f,int maxstorage,int editable);
extern void form_clear(form *f);
extern void draw_field(formfield *f);
<p><p>1.4 +190 -99 postfish/postfish.c
Index: postfish.c
===================================================================
RCS file: /usr/local/cvsroot/postfish/postfish.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- postfish.c 1 Dec 2002 06:30:17 -0000 1.3
+++ postfish.c 1 Dec 2002 08:34:40 -0000 1.4
@@ -70,13 +70,14 @@
static int rate=0;
static int ch=0;
static int signp=0;
-
#define MAX_DECAY_MS 2000
/* saved, but not part of a config profile */
static long TX[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
static long A=0;
static long B=-1;
+static long eq_m=1;
+static long n_m=1;
typedef struct {
long block_a;
@@ -101,26 +102,26 @@
static long configactive=0;
static configprofile configlist[CONFIG_MAX]={
{
- 8192,2,300,-30,0,1,0,1,1,
+ 8192,2,3000,-30,0,1,0,1,1,
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
1,
- {-120,-120,-120,-120,-120,-120,-120,-120,-120,
- -120,-120,-120,-120,-120,-120,-120,-120,-120,
- -120,-120,-120,-120,-120,-120,-120,-120,-120,
- -120,-120,-120,-120,-120,-120,-120,-120},
+ {-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,
+ -1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,
+ -1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,
+ -1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200},
1,
}
};
static configprofile configdefault={
- 8192,2,300,-30,0,1,0,1,1,
+ 8192,2,3000,-30,0,1,0,1,1,
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
1,
- {-120,-120,-120,-120,-120,-120,-120,-120,-120,
- -120,-120,-120,-120,-120,-120,-120,-120,-120,
- -120,-120,-120,-120,-120,-120,-120,-120,-120,
- -120,-120,-120,-120,-120,-120,-120,-120},
+ {-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,
+ -1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,
+ -1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200,
+ -1200,-1200,-1200,-1200,-1200,-1200,-1200,-1200},
0,
};
static configprofile wc;
@@ -215,10 +216,10 @@
#define D_Y 2
#define D_X 70
-#define T_Y (6+BANDS)
+#define T_Y (7+BANDS)
#define T_X 6
-#define C_Y (BANDS-CONFIG_MAX+2)
+#define C_Y (BANDS-CONFIG_MAX+3)
#define C_X D_X
form editf;
@@ -226,7 +227,7 @@
void update_N(){
- mvaddstr(N_Y,N_X+4," [n] Noise Gate ");
+ mvaddstr(N_Y,N_X+4," [n] Noisegate ");
if(wc.noise_p){
attron(A_BOLD);
addstr("ON ");
@@ -237,57 +238,126 @@
attrset(0);
+ mvaddstr(N_Y+1,N_X+4," [N] Edit Band ");
+ if(n_m){
+ attron(A_BOLD);
+ addstr("NARROW");
+ }else{
+ attron(A_BOLD);
+ addstr("WIDE ");
+ }
+
+ attrset(0);
}
void dirty_the_noise(){
+ int i,j;
noise_dirty=1;
+
+ /* really evil little hack to implement 'wideband' editing */
+ /* compare working settings to the copy stored in profile to figure out
+ what just got incremented/decremented */
+ if(!n_m){
+ for(i=0;i<BANDS;i++)
+ if(wc.noiset[i]!=configlist[configactive].noiset[i])break;
+ if(i<BANDS){
+ int del=wc.noiset[i]-configlist[configactive].noiset[i];
+ for(j=-3;j<4;j++){
+ if(i+j>=0 && i+j<BANDS){
+ switch(j){
+ case -3:case 3:
+ wc.noiset[i+j]+=del*.2;
+ break;
+ case -2:case 2:
+ wc.noiset[i+j]+=del*.5;
+ break;
+ case -1:case 1:
+ wc.noiset[i+j]+=del*.8;
+ break;
+ }
+ }
+ }
+ }
+ memcpy(configlist[configactive].noiset,wc.noiset,sizeof(wc.noiset));
+ form_redraw(&editf);
+ }
}
+
void dirty_the_eq(){
+ int i,j;
eq_dirty=1;
+
+ /* really evil little hack to implement 'wideband' editing */
+ /* compare working settings to the copy stored in profile to figure out
+ what just got incremented/decremented */
+ if(!eq_m){
+ for(i=0;i<BANDS;i++)
+ if(wc.eqt[i]!=configlist[configactive].eqt[i])break;
+ if(i<BANDS){
+ int del=wc.eqt[i]-configlist[configactive].eqt[i];
+ for(j=-3;j<4;j++){
+ if(i+j>=0 && i+j<BANDS){
+ switch(j){
+ case -3:case 3:
+ wc.eqt[i+j]+=del*.2;
+ break;
+ case -2:case 2:
+ wc.eqt[i+j]+=del*.5;
+ break;
+ case -1:case 1:
+ wc.eqt[i+j]+=del*.8;
+ break;
+ }
+ }
+ }
+ }
+ memcpy(configlist[configactive].eqt,wc.eqt,sizeof(wc.noiset));
+ form_redraw(&editf);
+ }
}
void update_static_N(){
int i;
- mvaddstr(N_Y+2, N_X," 63 ");
- mvaddstr(N_Y+4, N_X," 88 ");
- mvaddstr(N_Y+6, N_X," 125 ");
- mvaddstr(N_Y+8, N_X," 175 ");
- mvaddstr(N_Y+10,N_X," 250 ");
- mvaddstr(N_Y+12,N_X," 350 ");
- mvaddstr(N_Y+14,N_X," 500 ");
- mvaddstr(N_Y+16,N_X," 700 ");
- mvaddstr(N_Y+18,N_X," 1k ");
- mvaddstr(N_Y+20,N_X,"1.4k ");
- mvaddstr(N_Y+22,N_X," 2k ");
- mvaddstr(N_Y+24,N_X,"2.8k ");
- mvaddstr(N_Y+26,N_X," 4k ");
- mvaddstr(N_Y+28,N_X,"5.6k ");
- mvaddstr(N_Y+30,N_X," 8k ");
- mvaddstr(N_Y+32,N_X," 11k ");
- mvaddstr(N_Y+34,N_X," 16k ");
- mvaddstr(N_Y+36,N_X," 22k ");
-
- mvvline(N_Y+2,N_X+9,0,BANDS);
- mvvline(N_Y+2,N_X+20,0,BANDS);
- mvvline(N_Y+2,N_X+31,0,BANDS);
-
- mvhline(N_Y+1,N_X+9,0,23);
- mvhline(N_Y+2+BANDS,N_X+9,0,23);
-
- mvaddch(N_Y+1,N_X+9,ACS_ULCORNER);
- mvaddch(N_Y+1,N_X+31,ACS_URCORNER);
- mvaddch(N_Y+1,N_X+20,ACS_TTEE);
- mvaddch(N_Y+2+BANDS,N_X+9,ACS_LLCORNER);
- mvaddch(N_Y+2+BANDS,N_X+31,ACS_LRCORNER);
-
- mvaddstr(N_Y+2+BANDS,N_X," dB");
- mvaddstr(N_Y+2+BANDS,N_X+10,"30- ");
- mvaddstr(N_Y+2+BANDS,N_X+19," 0 ");
- mvaddstr(N_Y+2+BANDS,N_X+27," +30");
+ mvaddstr(N_Y+3, N_X," 63 ");
+ mvaddstr(N_Y+5, N_X," 88 ");
+ mvaddstr(N_Y+7, N_X," 125 ");
+ mvaddstr(N_Y+9, N_X," 175 ");
+ mvaddstr(N_Y+11,N_X," 250 ");
+ mvaddstr(N_Y+13,N_X," 350 ");
+ mvaddstr(N_Y+15,N_X," 500 ");
+ mvaddstr(N_Y+17,N_X," 700 ");
+ mvaddstr(N_Y+19,N_X," 1k ");
+ mvaddstr(N_Y+21,N_X,"1.4k ");
+ mvaddstr(N_Y+23,N_X," 2k ");
+ mvaddstr(N_Y+25,N_X,"2.8k ");
+ mvaddstr(N_Y+27,N_X," 4k ");
+ mvaddstr(N_Y+29,N_X,"5.6k ");
+ mvaddstr(N_Y+31,N_X," 8k ");
+ mvaddstr(N_Y+33,N_X," 11k ");
+ mvaddstr(N_Y+35,N_X," 16k ");
+ mvaddstr(N_Y+37,N_X," 22k ");
+
+ mvvline(N_Y+3,N_X+9,0,BANDS);
+ mvvline(N_Y+3,N_X+20,0,BANDS);
+ mvvline(N_Y+3,N_X+31,0,BANDS);
+
+ mvhline(N_Y+2,N_X+9,0,23);
+ mvhline(N_Y+3+BANDS,N_X+9,0,23);
+
+ mvaddch(N_Y+2,N_X+9,ACS_ULCORNER);
+ mvaddch(N_Y+2,N_X+31,ACS_URCORNER);
+ mvaddch(N_Y+2,N_X+20,ACS_TTEE);
+ mvaddch(N_Y+3+BANDS,N_X+9,ACS_LLCORNER);
+ mvaddch(N_Y+3+BANDS,N_X+31,ACS_LRCORNER);
+
+ mvaddstr(N_Y+3+BANDS,N_X," dB");
+ mvaddstr(N_Y+3+BANDS,N_X+10,"30- ");
+ mvaddstr(N_Y+3+BANDS,N_X+19," 0 ");
+ mvaddstr(N_Y+3+BANDS,N_X+27," +30");
for(i=0;i<BANDS;i++)
- field_add(&editf,FORM_DB,N_X+5,N_Y+2+i,4,&wc.noiset[i],
- dirty_the_noise,0,-150,0);
+ field_add(&editf,FORM_DB,N_X+5,N_Y+3+i,4,&wc.noiset[i],
+ dirty_the_noise,0,-1500,0);
}
void update_E(){
@@ -300,51 +370,60 @@
addstr("OFF");
}
attrset(0);
+ mvaddstr(E_Y+1,E_X+4," [E] Edit Band ");
+ if(eq_m){
+ attron(A_BOLD);
+ addstr("NARROW");
+ }else{
+ attron(A_BOLD);
+ addstr("WIDE ");
+ }
+ attrset(0);
}
void update_static_E(){
int i;
- mvaddstr(E_Y+2, E_X," 63 ");
- mvaddstr(E_Y+4, E_X," 88 ");
- mvaddstr(E_Y+6, E_X," 125 ");
- mvaddstr(E_Y+8, E_X," 175 ");
- mvaddstr(E_Y+10,E_X," 250 ");
- mvaddstr(E_Y+12,E_X," 350 ");
- mvaddstr(E_Y+14,E_X," 500 ");
- mvaddstr(E_Y+16,E_X," 700 ");
- mvaddstr(E_Y+18,E_X," 1k ");
- mvaddstr(E_Y+20,E_X,"1.4k ");
- mvaddstr(E_Y+22,E_X," 2k ");
- mvaddstr(E_Y+24,E_X,"2.8k ");
- mvaddstr(E_Y+26,E_X," 4k ");
- mvaddstr(E_Y+28,E_X,"5.6k ");
- mvaddstr(E_Y+30,E_X," 8k ");
- mvaddstr(E_Y+32,E_X," 11k ");
- mvaddstr(E_Y+34,E_X," 16k ");
- mvaddstr(E_Y+36,E_X," 22k ");
-
- mvvline(E_Y+2,E_X+8,0,BANDS);
- mvvline(E_Y+2,E_X+30,0,BANDS);
-
- mvhline(E_Y+1,E_X+8,0,23);
- mvhline(E_Y+2+BANDS,E_X+8,0,23);
-
- mvaddch(E_Y+1,E_X+8,ACS_ULCORNER);
- mvaddch(E_Y+1,E_X+30,ACS_URCORNER);
- mvaddch(E_Y+2+BANDS,E_X+8,ACS_LLCORNER);
- mvaddch(E_Y+2+BANDS,E_X+30,ACS_LRCORNER);
-
- mvaddstr(E_Y+2+BANDS,E_X," dB");
- mvaddstr(E_Y+2+BANDS,E_X+9,"30- ");
- mvaddstr(E_Y+2+BANDS,E_X+18," 0 ");
- mvaddstr(E_Y+2+BANDS,E_X+26," +30");
+ mvaddstr(E_Y+3, E_X," 63 ");
+ mvaddstr(E_Y+5, E_X," 88 ");
+ mvaddstr(E_Y+7, E_X," 125 ");
+ mvaddstr(E_Y+9, E_X," 175 ");
+ mvaddstr(E_Y+11,E_X," 250 ");
+ mvaddstr(E_Y+13,E_X," 350 ");
+ mvaddstr(E_Y+15,E_X," 500 ");
+ mvaddstr(E_Y+17,E_X," 700 ");
+ mvaddstr(E_Y+19,E_X," 1k ");
+ mvaddstr(E_Y+21,E_X,"1.4k ");
+ mvaddstr(E_Y+23,E_X," 2k ");
+ mvaddstr(E_Y+25,E_X,"2.8k ");
+ mvaddstr(E_Y+27,E_X," 4k ");
+ mvaddstr(E_Y+29,E_X,"5.6k ");
+ mvaddstr(E_Y+31,E_X," 8k ");
+ mvaddstr(E_Y+33,E_X," 11k ");
+ mvaddstr(E_Y+35,E_X," 16k ");
+ mvaddstr(E_Y+37,E_X," 22k ");
+
+ mvvline(E_Y+3,E_X+8,0,BANDS);
+ mvvline(E_Y+3,E_X+30,0,BANDS);
+
+ mvhline(E_Y+2,E_X+8,0,23);
+ mvhline(E_Y+3+BANDS,E_X+8,0,23);
+
+ mvaddch(E_Y+2,E_X+8,ACS_ULCORNER);
+ mvaddch(E_Y+2,E_X+30,ACS_URCORNER);
+ mvaddch(E_Y+3+BANDS,E_X+8,ACS_LLCORNER);
+ mvaddch(E_Y+3+BANDS,E_X+30,ACS_LRCORNER);
+
+ mvaddstr(E_Y+3+BANDS,E_X," dB");
+ mvaddstr(E_Y+3+BANDS,E_X+9,"30- ");
+ mvaddstr(E_Y+3+BANDS,E_X+18," 0 ");
+ mvaddstr(E_Y+3+BANDS,E_X+26," +30");
- mvaddstr(E_Y+1,E_X+9,"120- ");
- mvaddstr(E_Y+1,E_X+27," +0");
+ mvaddstr(E_Y+2,E_X+9,"120- ");
+ mvaddstr(E_Y+2,E_X+27," +0");
for(i=0;i<BANDS;i++)
- field_add(&editf,FORM_DB,E_X+5,E_Y+2+i,3,&wc.eqt[i],
- dirty_the_eq,0,-30,30);
+ field_add(&editf,FORM_DB,E_X+5,E_Y+3+i,3,&wc.eqt[i],
+ dirty_the_eq,0,-300,300);
}
@@ -474,7 +553,7 @@
field_add(&editf,FORM_DB,D_X+23,D_Y+1,5,&wc.dynamicatt,NULL,1,-900,+900);
field_add(&editf,FORM_P2,D_X+23,D_Y+2,5,&wc.block_a,NULL,0,64,MAX_BLOCKSIZE);
field_add(&editf,FORM_DB,D_X+23,D_Y+8,5,&wc.dynt,NULL,1,-300,0);
- limit_field=field_add(&editf,FORM_DB,D_X+23,D_Y+9,5,&wc.dynms,NULL,0,0,MAX_DECAY_MS);
+ limit_field=field_add(&editf,FORM_DB,D_X+23,D_Y+9,5,&wc.dynms,NULL,0,0,MAX_DECAY_MS*10);
mvaddstr(D_Y+14,D_X,"[a] [A] Clear");
mvaddstr(D_Y+15,D_X,"[b] [B] Clear");
@@ -551,7 +630,7 @@
mvaddstr(T_Y,T_X,"[0>");
field_add(&noneditf,FORM_TIME,T_X+3,T_Y,11,&TX[0],NULL,0,0,99999999);
mvaddstr(T_Y,T_X+19,"[1>");
- field_add(&noneditf,FORM_TIME,T_X+21,T_Y,11,&TX[1],NULL,0,0,99999999);
+ field_add(&noneditf,FORM_TIME,T_X+22,T_Y,11,&TX[1],NULL,0,0,99999999);
mvaddstr(T_Y,T_X+38,"[2>");
field_add(&noneditf,FORM_TIME,T_X+41,T_Y,11,&TX[2],NULL,0,0,99999999);
mvaddstr(T_Y,T_X+57,"[3>");
@@ -562,7 +641,7 @@
mvaddstr(T_Y+1,T_X,"[5>");
field_add(&noneditf,FORM_TIME,T_X+3,T_Y+1,11,&TX[5],NULL,0,0,99999999);
mvaddstr(T_Y+1,T_X+19,"[6>");
- field_add(&noneditf,FORM_TIME,T_X+21,T_Y+1,11,&TX[6],NULL,0,0,99999999);
+ field_add(&noneditf,FORM_TIME,T_X+22,T_Y+1,11,&TX[6],NULL,0,0,99999999);
mvaddstr(T_Y+1,T_X+38,"[7>");
field_add(&noneditf,FORM_TIME,T_X+41,T_Y+1,11,&TX[7],NULL,0,0,99999999);
mvaddstr(T_Y+1,T_X+57,"[8>");
@@ -590,13 +669,13 @@
for(i=0;i<BANDS;i++){
int valM,valA,valT;
- valT=rint(wc.eqt[i]/3.+10);
+ valT=rint(wc.eqt[i]/30.+10);
pthread_mutex_lock(&master_mutex);
valM=rint(todB(eqt_feedbackmax[i])/5.7142857+21);
valA=rint(todB(eqt_feedbackav[i]/eqt_feedbackcount[i])/5.7142857+21);
pthread_mutex_unlock(&master_mutex);
- move(E_Y+2+i,E_X+9);
+ move(E_Y+3+i,E_X+9);
for(j=0;j<valA && j<21;j++){
if(j==valT)
addch(ACS_VLINE);
@@ -656,7 +735,7 @@
}
pthread_mutex_unlock(&master_mutex);
- move(N_Y+2+i,N_X+10);
+ move(N_Y+3+i,N_X+10);
for(j=0;j<valA && j<=21;j++){
if(j==21)
addch('+');
@@ -837,7 +916,7 @@
double thresh=fromdB(wc.dynt*.1);
double y=0;
double d=0;
- long ms=wc.dynms;
+ long ms=wc.dynms/10;
pthread_mutex_unlock(&master_mutex);
for(j=0;j<ch;j++)
@@ -926,7 +1005,7 @@
oc[i]=rint(hoc);
dhoc=sin(dhoc*M_PI/2)*sin(dhoc*M_PI/2);
- dB=set[ihoc]*(1.-dhoc)+set[ihoc+1]*dhoc;
+ dB=(set[ihoc]/10)*(1.-dhoc)+(set[ihoc+1]/10)*dhoc;
t[i]=fromdB(dB);
}
@@ -1487,6 +1566,8 @@
fprintf(f,"A:%ld\n",A);
fprintf(f,"B:%ld\n",B);
+ fprintf(f,"NM:%ld\n",n_m);
+ fprintf(f,"EQM:%ld\n",eq_m);
for(i=0;i<10;i++)
fprintf(f,"TIME_%d:%ld\n",i,TX[i]);
@@ -1564,6 +1645,8 @@
}
+ confparse_ld(buffer,"NM",&n_m);
+ confparse_ld(buffer,"EQM",&eq_m);
confparse_ld(buffer,"A",&A);
confparse_ld(buffer,"B",&B);
@@ -1791,7 +1874,7 @@
aseek(0);
{
- int ysize=10+BANDS;
+ int ysize=11+BANDS;
int xsize=104;
initscr(); cbreak(); noecho();
@@ -1814,7 +1897,7 @@
form_init(&editf,120,1);
form_init(&noneditf,50,0);
box(stdscr,0,0);
- mvaddstr(0, 2, " Postfish Filter $Id: postfish.c,v 1.3 2002/12/01 06:30:17 xiphmont Exp $ ");
+ mvaddstr(0, 2, " Postfish Filter $Id: postfish.c,v 1.4 2002/12/01 08:34:40 xiphmont Exp $ ");
mvaddstr(LINES-1, 2,
" [<]<< [,]< [Spc] Play/Pause [Bksp] Stop/Cue [.]> [>]>> ");
@@ -1843,6 +1926,14 @@
int c=form_handle_char(&editf,pgetch());
if(c=='q')break;
switch(c){
+ case 'N':
+ n_m=!n_m;
+ update_N();
+ break;
+ case 'E':
+ eq_m=!eq_m;
+ update_E();
+ break;
case '<':
pthread_mutex_lock(&master_mutex);
aseek(cursor-rate*ch*inbytes*60);
<p><p>--- >8 ----
List archives: http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'cvs-request at xiph.org'
containing only the word 'unsubscribe' in the body. No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.
More information about the commits
mailing list