/*	V02ファイルからサウンドデータを抽出するプログラム	*/

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>

/*
［以下は動くざんすのドキュメントより抜粋］


＜＜  バインダヘッダ  ＞＞

Ｂｙｔｅ        Ｓｉｚｅ        内容

    ＋０        ４              バインダ番号
    ＋４        ４              バインダ data size (本ヘッダは含まない)

    ＋8〜31                     空き

    計32バイト

  バインダとは6400バイトの音声データと，8ページ分の圧縮画像データを合わせた
ものです。

＜＜Ｖ02ファイルの全体の構成＞＞

  メインヘッダ(256)  ＋  ＹＣtoＲＧＢテーブル(32768)  ＋  Ｙテーブル(512)
  ＋バインダヘッダ(32)  ＋  音声データ(6400)  ＋動画データ(不定)
  ＋バインダヘッダ(32)  ＋  音声データ(6400)  ＋動画データ(不定)  …
*/

char	sndhed[32]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x11,0x11,0x11,0x11,0x22,0x22,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x03,0x00,0x00,0x3C,0x00,0x00,0x00};

char	buf[6400];
long	bind[8];

void	main(int argc,char *argv[])
{
	long	s,frame,c,b,freq;
	FILE	*fin,*fout;
	
	puts("V02ファイルからサウンドデータを抽出するプログラム");
	puts("copyright (c) 1993,1994 by bye");
	puts("special thanks to Hiroshi TODA\n");
	
	if(argc!=3)
		{
		puts("使用法 : v02snd infile(V02 file) outfile(SND file)");
		puts("");
		puts("V02 形式の infile を読み込み，サウンドデータを抽出し");
		puts("outfile　に書き出します");
		return;
		}
	
	/*	読み込むファイルをオープン	*/
	if((fin=fopen(argv[1],"rb"))==NULL)
		{
		printf("%s が読めません\n",argv[1]);
		return;
		}
	
	/*	書き出すファイルをオープン	*/
	if((fout=fopen(argv[2],"wb"))==NULL)
		{
		printf("%s が書けません\n",argv[2]);
		return;
		}
	
	/*	とりあえずダミーでサウンドヘッダを書いておく	*/
	fwrite(sndhed,1,32,fout);
	
	/*	ヘッダ部分を読む	*/
	fread(buf,1,256,fin);
	frame=*((unsigned long *)(buf+8));
	freq=*((unsigned long *)(buf+32));
	
	/*	ＹＣtoＲＧとテーブルとＹテーブルを読み飛ばす	*/
	fseek(fin,32768L+512L,SEEK_CUR);
	
	printf("%s->%s\n",argv[1],argv[2]);
	
	s=c=0;
	b=-1;
	while(!feof(fin))
		{
		fread((char *)bind,1,32,fin);
		if(bind[0]==b)	break;
		b=bind[0];
		fread(buf,1,6400,fin);
		fwrite(buf,1,6400,fout);
		s+=6400;
		c++;
		fseek(fin,bind[1]-6400L,SEEK_CUR);
		printf("now getting %ld/%ld\r",c,(frame+7)/8);
		}
	
	/*	サウンドヘッダを書き直す	*/
	*((unsigned long *)(sndhed+12))=s;						/*	サイズ	*/
	*((unsigned long *)(sndhed+24))=(freq*0x62L/1000L);		/*	周波数	*/
	fseek(fout,0,SEEK_SET);
	fwrite(sndhed,1,32,fout);
	
	fclose(fin);
	fclose(fout);
	
	printf("\n正常終了\n");
	
	return;
}
