mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-26 23:55:40 +00:00
ddd6fa92ef
- CSoundBoard is not derived from CBus. - Optimized sound board memory handlers (now using switch statements). - Added DSB emulation (based on R. Belmont's M1 source code). - Improved ROM loading: only unique ROMs (those not shared amongst games) are used to identify games. The ROM loader will no longer get confused as easily. - General cleanup here and there, removed unused Render.h file.
104 lines
3 KiB
C++
104 lines
3 KiB
C++
/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
|
|
*/
|
|
/* position.c ffwd/rew within a stream
|
|
*
|
|
* Creted by: Tomislav Uzelac, May 10 1997
|
|
*/
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "amp.h"
|
|
#include "audio.h"
|
|
#include "getbits.h"
|
|
|
|
#define POSITION
|
|
#include "position.h"
|
|
|
|
/* Returns the number of frames actually skipped, -1 on error.
|
|
*
|
|
* Values in header are not changed if retval!=nframes.
|
|
* This is not necessary because gethdr() doesn't clobber
|
|
* the contents of header, but I don't want to rely on that.
|
|
*/
|
|
int ffwd(struct AUDIO_HEADER *header, int nframes)
|
|
{
|
|
int cnt=0,g;
|
|
int hsize,bitrate,fs,mean_frame_size;
|
|
struct AUDIO_HEADER tmp;
|
|
memcpy(&tmp,header,sizeof(tmp));
|
|
|
|
while (cnt < nframes) {
|
|
if (tmp.ID)
|
|
if (tmp.mode==3) hsize=21;
|
|
else hsize=36;
|
|
else
|
|
if (tmp.mode==3) hsize=13;
|
|
else hsize=21;
|
|
if (tmp.protection_bit==0) hsize+=2;
|
|
if ((g=dummy_getinfo(hsize))) /* dummy_getinfo: reads hsize-4 bytes */
|
|
switch (g) {
|
|
case GETHDR_EOF: return cnt;
|
|
case GETHDR_ERR:
|
|
default: return -1;
|
|
}
|
|
|
|
bitrate=t_bitrate[tmp.ID][3-tmp.layer][tmp.bitrate_index];
|
|
fs=t_sampling_frequency[tmp.ID][tmp.sampling_frequency];
|
|
if (tmp.ID) mean_frame_size=144000*bitrate/fs;
|
|
else mean_frame_size=72000*bitrate/fs;
|
|
fillbfr(mean_frame_size + tmp.padding_bit - hsize);
|
|
|
|
if ((g=gethdr(&tmp)))
|
|
switch (g) {
|
|
case GETHDR_EOF: return cnt;
|
|
case GETHDR_ERR:
|
|
default: return -1;
|
|
}
|
|
cnt++;
|
|
}
|
|
|
|
memcpy(header,&tmp,sizeof(tmp));
|
|
return cnt;
|
|
}
|
|
|
|
/* Mostly the same as ffwd. Some streams might be 'tough', i.e.
|
|
* the ones switching bitrates.
|
|
*/
|
|
int rew(struct AUDIO_HEADER *header, int nframes)
|
|
{
|
|
int cnt=0;
|
|
int bitrate,fs,mean_frame_size;
|
|
struct AUDIO_HEADER tmp;
|
|
memcpy(&tmp,header,sizeof(tmp));
|
|
|
|
while (cnt < nframes) {
|
|
/* ffwd/rew functions are to be called right after the header has been parsed
|
|
* so we have to go back one frame + 4 bytes + 1 byte (in case padding was used).
|
|
*/
|
|
bitrate=t_bitrate[tmp.ID][3-tmp.layer][tmp.bitrate_index];
|
|
fs=t_sampling_frequency[tmp.ID][tmp.sampling_frequency];
|
|
if (tmp.ID) mean_frame_size=144000*bitrate/fs;
|
|
else mean_frame_size=72000*bitrate/fs;
|
|
|
|
if (rewind_stream(mean_frame_size) !=0) {
|
|
memcpy(header,&tmp,sizeof(tmp));
|
|
return cnt;
|
|
}
|
|
if ((gethdr(&tmp))) return -1;
|
|
cnt++;
|
|
}
|
|
/* We have to make sure that the bit reservoir contains enough data.
|
|
* Hopefully, layer3_frame will take care of that.
|
|
*/
|
|
f_bdirty=TRUE;
|
|
bclean_bytes=0;
|
|
|
|
memcpy(header,&tmp,sizeof(tmp));
|
|
return cnt;
|
|
}
|
|
|
|
/* TODO: after the gethdr function is enhanced with the counter to count
|
|
* the number of bytes to search for the next syncword, make the call to
|
|
* gethdr() from rew() have that counter something like (frame_size-1) so
|
|
* that we don't go back again and again to the same header. (not very important)
|
|
*/
|