00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include "common.h"
00005 #include "encoder.h"
00006 #include "options.h"
00007 #include "portableio.h"
00008 #include "audio_read.h"
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 unsigned long
00024 read_samples (FILE * musicin, short sample_buffer[2304],
00025 unsigned long num_samples, unsigned long frame_size)
00026 {
00027 unsigned long samples_read;
00028 static unsigned long samples_to_read;
00029 static char init = TRUE;
00030
00031 if (init) {
00032 samples_to_read = num_samples;
00033
00034 }
00035 if (samples_to_read >= frame_size)
00036 samples_read = frame_size;
00037 else
00038 samples_read = samples_to_read;
00039
00040
00041
00042
00043
00044 if((samples_read = toolame_buffer_read((char*)sample_buffer,
00045 sizeof(short),
00046 samples_read)) == 0)
00047 fprintf (stderr, "Hit end of audio data\n");
00048
00049
00050
00051
00052 if (NativeByteOrder == order_unknown) {
00053 NativeByteOrder = DetermineByteOrder ();
00054 if (NativeByteOrder == order_unknown) {
00055 fprintf (stderr, "byte order not determined\n");
00056 exit (1);
00057 }
00058 }
00059 if (NativeByteOrder != order_littleEndian || (glopts.byteswap == TRUE))
00060 SwapBytesInWords (sample_buffer, samples_read);
00061
00062 if (num_samples != MAX_U_32_NUM)
00063 samples_to_read -= samples_read;
00064
00065 if (samples_read < frame_size && samples_read > 0) {
00066
00067 for (; samples_read < frame_size; sample_buffer[samples_read++] = 0);
00068 samples_to_read = 0;
00069 samples_read = frame_size;
00070 }
00071 return (samples_read);
00072 }
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 unsigned long
00085 get_audio (FILE * musicin, short buffer[2][1152], unsigned long num_samples,
00086 int nch, frame_header *header)
00087 {
00088 int j;
00089 short insamp[2304];
00090 unsigned long samples_read;
00091
00092 if (nch == 2) {
00093 samples_read =
00094 read_samples (musicin, insamp, num_samples, (unsigned long) 2304);
00095 if (glopts.channelswap == TRUE) {
00096 for (j = 0; j < 1152; j++) {
00097 buffer[1][j] = insamp[2 * j];
00098 buffer[0][j] = insamp[2 * j + 1];
00099 }
00100 } else {
00101 for (j = 0; j < 1152; j++) {
00102 buffer[0][j] = insamp[2 * j];
00103 buffer[1][j] = insamp[2 * j + 1];
00104 }
00105 }
00106 } else if (glopts.downmix == TRUE) {
00107 samples_read =
00108 read_samples (musicin, insamp, num_samples, (unsigned long) 2304);
00109 for (j = 0; j < 1152; j++) {
00110 buffer[0][j] = 0.5 * (insamp[2 * j] + insamp[2 * j + 1]);
00111 }
00112 } else {
00113 samples_read =
00114 read_samples (musicin, insamp, num_samples, (unsigned long) 1152);
00115 for (j = 0; j < 1152; j++) {
00116 buffer[0][j] = insamp[j];
00117
00118 }
00119 }
00120 return (samples_read);
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130 enum byte_order DetermineByteOrder (void)
00131 {
00132 char s[sizeof (long) + 1];
00133 union {
00134 long longval;
00135 char charval[sizeof (long)];
00136 } probe;
00137 probe.longval = 0x41424344L;
00138 strncpy (s, probe.charval, sizeof (long));
00139 s[sizeof (long)] = '\0';
00140
00141 if (strcmp (s, "ABCD") == 0)
00142 return order_bigEndian;
00143 else if (strcmp (s, "DCBA") == 0)
00144 return order_littleEndian;
00145 else
00146 return order_unknown;
00147 }
00148
00149 void SwapBytesInWords (short *loc, int words)
00150 {
00151 int i;
00152 short thisval;
00153 char *dst, *src;
00154 src = (char *) &thisval;
00155 for (i = 0; i < words; i++) {
00156 thisval = *loc;
00157 dst = (char *) loc++;
00158 dst[0] = src[1];
00159 dst[1] = src[0];
00160 }
00161 }
00162
00163
00164
00165
00166
00167
00168
00169 int aiff_read_headers (FILE * file_ptr, IFF_AIFF * aiff_ptr)
00170 {
00171 int chunkSize, subSize, sound_position;
00172
00173 if (fseek (file_ptr, 0, SEEK_SET) != 0)
00174 return -1;
00175
00176 if (Read32BitsHighLow (file_ptr) != IFF_ID_FORM)
00177 return -1;
00178
00179 chunkSize = Read32BitsHighLow (file_ptr);
00180
00181 if (Read32BitsHighLow (file_ptr) != IFF_ID_AIFF)
00182 return -1;
00183
00184 sound_position = 0;
00185 while (chunkSize > 0) {
00186 chunkSize -= 4;
00187 switch (Read32BitsHighLow (file_ptr)) {
00188
00189 case IFF_ID_COMM:
00190 chunkSize -= subSize = Read32BitsHighLow (file_ptr);
00191 aiff_ptr->numChannels = Read16BitsHighLow (file_ptr);
00192 subSize -= 2;
00193 aiff_ptr->numSampleFrames = Read32BitsHighLow (file_ptr);
00194 subSize -= 4;
00195 aiff_ptr->sampleSize = Read16BitsHighLow (file_ptr);
00196 subSize -= 2;
00197 aiff_ptr->sampleRate = ReadIeeeExtendedHighLow (file_ptr);
00198 subSize -= 10;
00199 while (subSize > 0) {
00200 getc (file_ptr);
00201 subSize -= 1;
00202 }
00203 break;
00204
00205 case IFF_ID_SSND:
00206 chunkSize -= subSize = Read32BitsHighLow (file_ptr);
00207 aiff_ptr->blkAlgn.offset = Read32BitsHighLow (file_ptr);
00208 subSize -= 4;
00209 aiff_ptr->blkAlgn.blockSize = Read32BitsHighLow (file_ptr);
00210 subSize -= 4;
00211 sound_position = ftell (file_ptr) + aiff_ptr->blkAlgn.offset;
00212 if (fseek (file_ptr, (long) subSize, SEEK_CUR) != 0)
00213 return -1;
00214 aiff_ptr->sampleType = IFF_ID_SSND;
00215 break;
00216
00217 default:
00218 chunkSize -= subSize = Read32BitsHighLow (file_ptr);
00219 while (subSize > 0) {
00220 getc (file_ptr);
00221 subSize -= 1;
00222 }
00223 break;
00224 }
00225 }
00226 return sound_position;
00227 }
00228
00229
00230
00231
00232
00233
00234
00235 int aiff_seek_to_sound_data (FILE * file_ptr)
00236 {
00237 if (fseek
00238 (file_ptr, AIFF_FORM_HEADER_SIZE + AIFF_SSND_HEADER_SIZE,
00239 SEEK_SET) != 0)
00240 return (-1);
00241 return (0);
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 void
00259 parse_input_file (FILE * musicin, char inPath[MAX_NAME_SIZE], frame_header *header,
00260 unsigned long *num_samples)
00261 {
00262
00263 IFF_AIFF pcm_aiff_data;
00264 long soundPosition;
00265
00266 unsigned char wave_header_buffer[40];
00267 int wave_header_read = 0;
00268 int wave_header_stereo = -1;
00269 int wave_header_16bit = -1;
00270 unsigned long samplerate;
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 *num_samples = MAX_U_32_NUM;
00285 return;
00286
00287
00288 if ((soundPosition = aiff_read_headers (musicin, &pcm_aiff_data)) != -1) {
00289 fprintf (stderr, ">>> Using Audio IFF sound file headers\n");
00290 aiff_check (inPath, &pcm_aiff_data, &header->version);
00291 if (fseek (musicin, soundPosition, SEEK_SET) != 0) {
00292 fprintf (stderr, "Could not seek to PCM sound data in \"%s\".\n",
00293 inPath);
00294 exit (1);
00295 }
00296 fprintf (stderr, "Parsing AIFF audio file \n");
00297 header->sampling_frequency =
00298 toolame_SmpFrqIndex ((long) pcm_aiff_data.sampleRate, &header->version);
00299 fprintf (stderr, ">>> %f Hz sampling frequency selected\n",
00300 pcm_aiff_data.sampleRate);
00301
00302
00303 *num_samples = pcm_aiff_data.numChannels * pcm_aiff_data.numSampleFrames;
00304
00305 if (pcm_aiff_data.numChannels == 1) {
00306 header->mode = MPG_MD_MONO;
00307 header->mode_ext = 0;
00308 }
00309 return;
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 fseek (musicin, 0, SEEK_SET);
00328 fread (wave_header_buffer, 1, 40, musicin);
00329
00330 if (wave_header_buffer[8] == 'W' && wave_header_buffer[9] == 'A'
00331 && wave_header_buffer[10] == 'V' && wave_header_buffer[11] == 'E') {
00332 fprintf (stderr, "Parsing Wave File Header\n");
00333 if (NativeByteOrder == order_unknown) {
00334 NativeByteOrder = DetermineByteOrder ();
00335 if (NativeByteOrder == order_unknown) {
00336 fprintf (stderr, "byte order not determined\n");
00337 exit (1);
00338 }
00339 }
00340 if (NativeByteOrder == order_littleEndian) {
00341 samplerate = *(unsigned long *) (&wave_header_buffer[24]);
00342 } else {
00343 samplerate = wave_header_buffer[27] +
00344 (wave_header_buffer[26] << 8) +
00345 (wave_header_buffer[25] << 16) + (wave_header_buffer[24] << 24);
00346 }
00347
00348 wave_header_read = 1;
00349 switch (samplerate) {
00350 case 44100:
00351 case 48000:
00352 case 32000:
00353 case 24000:
00354 case 22050:
00355 case 16000:
00356 fprintf (stderr, ">>> %ld Hz sampling freq selected\n", samplerate);
00357 break;
00358 default:
00359
00360 fprintf (stderr, ">>> Unknown samp freq %ld Hz in Wave Header\n",
00361 samplerate);
00362 fprintf (stderr, ">>> Default 44.1 kHz samp freq selected\n");
00363 samplerate = 44100;
00364 }
00365
00366 if ((header->sampling_frequency =
00367 toolame_SmpFrqIndex ((long) samplerate, &header->version)) < 0) {
00368 fprintf (stderr, "invalid sample rate\n");
00369 exit (0);
00370 }
00371
00372 if ((long) wave_header_buffer[22] == 1) {
00373 fprintf (stderr, ">>> Input Wave File is Mono\n");
00374 wave_header_stereo = 0;
00375 header->mode = MPG_MD_MONO;
00376 header->mode_ext = 0;
00377 }
00378 if ((long) wave_header_buffer[22] == 2) {
00379 fprintf (stderr, ">>> Input Wave File is Stereo\n");
00380 wave_header_stereo = 1;
00381 }
00382 if ((long) wave_header_buffer[32] == 1) {
00383 fprintf (stderr, ">>> Input Wave File is 8 Bit\n");
00384 wave_header_16bit = 0;
00385 fprintf (stderr, "Input File must be 16 Bit! Please Re-sample");
00386 exit (1);
00387 }
00388 if ((long) wave_header_buffer[32] == 2) {
00389 if (wave_header_stereo == 1) {
00390 fprintf (stderr, ">>> Input Wave File is 8 Bit\n");
00391 wave_header_16bit = 0;
00392 fprintf (stderr, "Input File must be 16 Bit! Please Re-sample");
00393 exit (1);
00394 } else {
00395
00396 wave_header_16bit = 1;
00397 }
00398 }
00399 if ((long) wave_header_buffer[32] == 4) {
00400
00401 wave_header_16bit = 1;
00402 }
00403
00404 *num_samples = MAX_U_32_NUM;
00405 if (fseek (musicin, 44, SEEK_SET) != 0) {
00406
00407 fprintf (stderr, "Could not seek to PCM sound data in \"%s\".\n",
00408 inPath);
00409 exit (1);
00410 }
00411 return;
00412 }
00413
00414
00415 fprintf (stderr, "No header found. Assuming Raw PCM sound file\n");
00416
00417 fseek (musicin, 0, SEEK_SET);
00418
00419
00420 *num_samples = MAX_U_32_NUM;
00421 }
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434 void aiff_check (char *file_name, IFF_AIFF * pcm_aiff_data, int *version)
00435 {
00436 if (pcm_aiff_data->sampleType != IFF_ID_SSND) {
00437 fprintf (stderr, "Sound data is not PCM in \"%s\".\n", file_name);
00438 exit (1);
00439 }
00440
00441 if (toolame_SmpFrqIndex ((long) pcm_aiff_data->sampleRate, version) < 0) {
00442 fprintf (stderr, "in \"%s\".\n", file_name);
00443 exit (1);
00444 }
00445
00446 if (pcm_aiff_data->sampleSize != sizeof (short) * BITS_IN_A_BYTE) {
00447 fprintf (stderr, "Sound data is not %d bits in \"%s\".\n",
00448 sizeof (short) * BITS_IN_A_BYTE, file_name);
00449 exit (1);
00450 }
00451
00452 if (pcm_aiff_data->numChannels != MONO
00453 && pcm_aiff_data->numChannels != STEREO) {
00454 fprintf (stderr, "Sound data is not mono or stereo in \"%s\".\n",
00455 file_name);
00456 exit (1);
00457 }
00458
00459 if (pcm_aiff_data->blkAlgn.blockSize != 0) {
00460 fprintf (stderr, "Block size is not %d bytes in \"%s\".\n", 0, file_name);
00461 exit (1);
00462 }
00463
00464 if (pcm_aiff_data->blkAlgn.offset != 0) {
00465 fprintf (stderr, "Block offset is not %d bytes in \"%s\".\n", 0,
00466 file_name);
00467 exit (1);
00468 }
00469 }