/*	
 *	clipmus.c
 *
 *	P/ECE標準音楽ライブラリ 補助ルーチン
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2004 Naoyuki Sawa
 *
 *	* Mon May 24 06:00:00 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 */
#include "clip.h"

static int (*old_WaveDataOut)(int ch, PCEWAVEINFO* pwi);

static int new_WaveDataOut(int ch, PCEWAVEINFO* pwi)
{
	short* p;
	int i;
	int v;
	int len;

	/* P/ECE標準音楽ライブラリの使用チャネルへの出力ならば、音量増幅します。
	 * 念のため、16bit PCM形式であることを確認しておきます。
	 * P/ECE標準音楽ライブラリの出力は、16bit PCM形式であるはずです。
	 */
	if((ch == music_wch) && (pwi->type & PW_TYPE_16BITPCM)) {
		p = (short*)pwi->pData;
		len = pwi->len;
		for(i = 0; i < len; i++) {
			v = *p << 2; /* 調整可。でも、4倍以上にすると音が割れるようです */
			     if(v < -32767) v = -32767;
			else if(v >  32767) v =  32767;
			*p++ = v;
		}
	}

	return old_WaveDataOut(ch, pwi);
}

void
music_loudness(int enable)
{
	if(enable) {
		if(old_WaveDataOut) return; /* 既にフックされていたら、何もしません */
		old_WaveDataOut = pceVectorSetKs(KSNO_WaveDataOut, new_WaveDataOut);
	} else {
		if(!old_WaveDataOut) return; /* まだフックされていなければ、何もしません */
		pceVectorSetKs(KSNO_WaveDataOut, old_WaveDataOut);
		old_WaveDataOut = NULL; /* フック解除したことをマーク、忘れないで!! */
	}
}

