static int mp3_startread(snd_stream_t *stream) { mp3_priv_t *p = (mp3_priv_t *) stream->priv; size_t ReadSize; mad_stream_init(&p->Stream); mad_frame_init(&p->Frame); mad_synth_init(&p->Synth); mad_timer_reset(&p->Timer); /* Decode at least one valid frame to find out the input * format. The decoded frame will be saved off so that it * can be processed later. */ ReadSize = FS_fread(p->mp3_buffer, 1, MP3_BUFFER_SIZE, &stream->fh); if (ReadSize != MP3_BUFFER_SIZE) { if (FS_feof(&stream->fh) || FS_ferror(&stream->fh)) return -1; } mad_stream_buffer(&p->Stream, p->mp3_buffer, ReadSize); /* Find a valid frame before starting up. This makes sure * that we have a valid MP3 and also skips past ID3v2 tags * at the beginning of the audio file. */ p->Stream.error = MAD_ERROR_NONE; while (mad_frame_decode(&p->Frame,&p->Stream)) { /* check whether input buffer needs a refill */ if (p->Stream.error == MAD_ERROR_BUFLEN) { if (mp3_inputdata(stream) == -1) return -1; continue; } /* Consume any ID3 tags */ mp3_inputtag(stream); /* FIXME: We should probably detect when we've read * a bunch of non-ID3 data and still haven't found a * frame. In that case we can abort early without * scanning the whole file. */ p->Stream.error = MAD_ERROR_NONE; } if (p->Stream.error) { Con_Printf("MP3: No valid MP3 frame found\n"); return -1; } switch(p->Frame.header.mode) { case MAD_MODE_SINGLE_CHANNEL: case MAD_MODE_DUAL_CHANNEL: case MAD_MODE_JOINT_STEREO: case MAD_MODE_STEREO: stream->info.channels = MAD_NCHANNELS(&p->Frame.header); break; default: Con_Printf("MP3: Cannot determine number of channels\n"); return -1; } p->FrameCount = 1; mad_timer_add(&p->Timer,p->Frame.header.duration); mad_synth_frame(&p->Synth,&p->Frame); stream->info.width = MP3_MAD_SAMPLEWIDTH; stream->info.rate = p->Synth.pcm.samplerate; p->cursamp = 0; return 0; }
/* =================== CFG_ReadCvars used for doing early reads from config.cfg searching the list of given cvar names for the user-set values. a temporary solution until we merge a better cvar system. the num_vars argument must be the exact number of strings in the array, otherwise I have nothing against going out of bounds. =================== */ void CFG_ReadCvars (const char **vars, int num_vars) { char buff[1024], *tmp; int i, j; if (!cfg_file || num_vars < 1) return; j = 0; do { i = 0; memset (buff, 0, sizeof(buff)); // we expect a line in the format that Cvar_WriteVariables // writes to the config file. although I'm trying to be as // much cautious as possible, if the user screws it up by // editing it, it's his fault. if (FS_fgets(buff, sizeof(buff), cfg_file)) { // remove end-of-line characters while (buff[i]) { if (buff[i] == '\r' || buff[i] == '\n') buff[i] = '\0'; // while we're here, replace tabs with spaces if (buff[i] == '\t') buff[i] = ' '; i++; } // go to the last character while (buff[i] == 0 && i > 0) i--; // remove trailing spaces while (i > 0) { if (buff[i] == ' ') { buff[i] = '\0'; i--; } else break; } // the line must end with a quotation mark if (buff[i] != '\"') continue; buff[i] = '\0'; for (i = 0; i < num_vars && vars[i]; i++) { // look for the cvar name + one space tmp = strstr(buff, va("%s ",vars[i])); if (tmp != buff) continue; // locate the first quotation mark tmp = strchr(buff, '\"'); if (tmp) { Cvar_Set (vars[i], tmp + 1); j++; break; } } } if (j == num_vars) break; } while (!FS_feof(cfg_file) && !FS_ferror(cfg_file)); FS_rewind (cfg_file); }
static BOOL MIK_Eof (MREADER *r) { return FS_feof(((mik_priv_t *)r)->fh); }