19#define dprintf(format, args...) \
20 fprintf(stderr, "ps2adpcm(%s): " format, __FUNCTION__, ## args)
31int GetPCM(
void *priv,
double *out,
int len)
38 if (pcm->Position+i>=pcm->SampleCount)
40 out[i] = pcm->Sample[((pcm->Position+i)*pcm->ChannelCount)+pcm->Channel];
48int PutADPCM(
void *priv,
void *data,
int len)
52 r = fwrite(data, 1, len, f);
55 dprintf(
"write error (%s)\n", strerror(errno));
62int main(
int argc,
char *argv[])
64 char *infile, *outfile;
75 dprintf(
"usage: %s <PCM Input> <ADPCM Output> -s(tereo) -c[chunksize] -l[loopstart]\n", argv[0]);
76 dprintf(
"example: %s - output.adpcm -s -c1024 -s1000\n", argv[0]);
84 for (
int i=3;i<argc;i++)
87 if (argv[i][0] !=
'-' || argv[i][1] ==
'\0')
89 dprintf(
"%s: invalid option '%s'\n", argv[0], argv[i]);
92 num = strtol(&argv[i][2], NULL, 0);
95 case 's': pcm.ChannelCount = 2;
break;
97 if (num<=0 || num >= 65536)
99 dprintf(
"%s: invalid block size (%ld, '%s')\n", argv[0], num, &argv[i][2]);
107 dprintf(
"%s: invalid loop start address (%ld, '%s')\n", argv[0], num, &argv[i][2]);
113 dprintf(
"%s: unkown option '%s'\n", argv[0], argv[i]);
120 if (!strcmp(infile,
"-"))
124 fi = fopen(infile,
"rb");
127 dprintf(
"Failed to open input file '%s' (%s)\n", infile, strerror(errno));
132 fo = fopen(outfile,
"wb");
135 dprintf(
"Failed to open output file '%s' (%s)\n", outfile, strerror(errno));
139 for (
int i=0;i<pcm.ChannelCount;i++)
141 set[i] = AdpcmCreate(GetPCM, &pcm, PutADPCM, fo, loopstart);
144 dprintf(
"Failed to create ADPCM setup\n");
149 if (pcm.ChannelCount>1)
155 pcm.Sample = malloc((bpc*28)*pcm.ChannelCount*2);
159 r = fread(pcm.Sample, 2*pcm.ChannelCount, (bpc*28), fi);
164 for (i=0;i<pcm.ChannelCount;i++)
168 if (AdpcmEncode(set[i], bpc)!=bpc)
171 if (i!=pcm.ChannelCount)