2006年4月18日火曜日

xmmsにソフトウェアボリュームを付ける



なんだか、手元のUSBオーディオはハードウェアボリュームは付いていてもソフトウェアボリュームがついていない。。。


これだと、だんだん音が大きくなる目覚しにつかえないorz...


音量は自体はxmmsctrlでいじってるわけだし。エフェクタがボリュームの設定値を見ればいいはずよねん。


ってことでさっくり書きました。


xmmsのプラグインで驚く程簡単につくれるんですね。


欠点としては、ボリュームの設定の反映が遅いことぐらいで後はすごい快適です。


また、手抜きとして出力時のフォーマット依存です。ま、普通は問題にならないはず。



gcc -I /usr/X11R6/include/ -I /usr/local/include/glib12/ -L /usr/X11R6/lib/ main.c -fPIC -c -o main.o

gcc -shared -Wl,-soname,libsoftvol.so -o softvol.so main.o


#include <xmms/plugin.h>

int mod_samples (gpointer *data, gint length, AFormat fmt, gint srate, gint nch);
extern void output_get_volume(int *l, int *r);

EffectPlugin softvolTable={
0, /* Filled in by xmms */
0, /* Filled in by xmms */
"Software Volume", /* The description that is shown in the preferences box */
NULL, /* Called when the plugin is loaded */
NULL, /* Called when the plugin is unloaded */
NULL, /* Show the about box */
NULL, /* Show the configure box */
mod_samples, /* Modify samples */
NULL,
};

// XMMS entry point
EffectPlugin *get_eplugin_info(void)
{
return
}
int mod_samples (gpointer *data, gint length, AFormat fmt, gint srate, gint nch){
int x;
int left, right;
gint16 *dataptr = (gint16 *)*data;

if (
!(
fmt == FMT_S16_NE ||
(fmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
(fmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)
) ||
nch != 2
)
return length;
int vl,vr;
output_get_volume(&vl, &vr);
for (x = 0; x < length; x += 4)
{
int l,r;
l=dataptr[0];
r=dataptr[1];
l *= vl;
l /= 100;
r *= vr;
r /= 100;

dataptr[0] =l;
dataptr[1] =r;

dataptr += 2;
}

return length;
}




0 件のコメント:

コメントを投稿