notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
timers implemented for new z80 mode
[picodrive.git]
/
Pico
/
sound
/
sound.c
diff --git
a/Pico/sound/sound.c
b/Pico/sound/sound.c
index
c39d0c1
..
4bc9292
100644
(file)
--- a/
Pico/sound/sound.c
+++ b/
Pico/sound/sound.c
@@
-21,7
+21,7
@@
void (*PsndMix_32_to_16l)(short *dest, int *src, int count) = mix_32_to_16l_ster
static int PsndBuffer[2*44100/50];
\r
\r
// dac
\r
static int PsndBuffer[2*44100/50];
\r
\r
// dac
\r
-static unsigned short dac_info[312]; // pppppppp ppppllll, p - pos in buff, l - length to write for this sample
\r
+static unsigned short dac_info[312
+4
]; // pppppppp ppppllll, p - pos in buff, l - length to write for this sample
\r
\r
// cdda output buffer
\r
short cdda_out_buffer[2*1152];
\r
\r
// cdda output buffer
\r
short cdda_out_buffer[2*1152];
\r
@@
-31,8
+31,13
@@
int PsndRate=0;
int PsndLen=0; // number of mono samples, multiply by 2 for stereo
\r
int PsndLen_exc_add=0; // this is for non-integer sample counts per line, eg. 22050/60
\r
int PsndLen_exc_cnt=0;
\r
int PsndLen=0; // number of mono samples, multiply by 2 for stereo
\r
int PsndLen_exc_add=0; // this is for non-integer sample counts per line, eg. 22050/60
\r
int PsndLen_exc_cnt=0;
\r
+int PsndDacLine=0;
\r
short *PsndOut=NULL; // PCM data buffer
\r
\r
short *PsndOut=NULL; // PCM data buffer
\r
\r
+// timers
\r
+int timer_a_next_oflow, timer_a_step, timer_a_offset; // in z80 cycles
\r
+int timer_b_next_oflow, timer_b_step, timer_b_offset;
\r
+
\r
// sn76496
\r
extern int *sn76496_regs;
\r
\r
// sn76496
\r
extern int *sn76496_regs;
\r
\r
@@
-41,13
+46,15
@@
static void dac_recalculate(void)
{
\r
int i, dac_cnt, pos, len, lines = Pico.m.pal ? 312 : 262, mid = Pico.m.pal ? 68 : 93;
\r
\r
{
\r
int i, dac_cnt, pos, len, lines = Pico.m.pal ? 312 : 262, mid = Pico.m.pal ? 68 : 93;
\r
\r
- if(PsndLen <= lines) {
\r
+ if (PsndLen <= lines)
\r
+ {
\r
// shrinking algo
\r
dac_cnt = -PsndLen;
\r
len=1; pos=0;
\r
dac_info[225] = 1;
\r
\r
// shrinking algo
\r
dac_cnt = -PsndLen;
\r
len=1; pos=0;
\r
dac_info[225] = 1;
\r
\r
- for(i=226; i != 225; i++) {
\r
+ for(i=226; i != 225; i++)
\r
+ {
\r
if (i >= lines) i = 0;
\r
len = 0;
\r
if(dac_cnt < 0) {
\r
if (i >= lines) i = 0;
\r
len = 0;
\r
if(dac_cnt < 0) {
\r
@@
-58,11
+65,14
@@
static void dac_recalculate(void)
dac_cnt -= PsndLen;
\r
dac_info[i] = (pos<<4)|len;
\r
}
\r
dac_cnt -= PsndLen;
\r
dac_info[i] = (pos<<4)|len;
\r
}
\r
- } else {
\r
+ }
\r
+ else
\r
+ {
\r
// stretching
\r
dac_cnt = PsndLen;
\r
pos=0;
\r
// stretching
\r
dac_cnt = PsndLen;
\r
pos=0;
\r
- for(i = 225; i != 224; i++) {
\r
+ for(i = 225; i != 224; i++)
\r
+ {
\r
if (i >= lines) i = 0;
\r
len=0;
\r
while(dac_cnt >= 0) {
\r
if (i >= lines) i = 0;
\r
len=0;
\r
while(dac_cnt >= 0) {
\r
@@
-83,6
+93,8
@@
static void dac_recalculate(void)
if (PsndLen_exc_add) len++;
\r
dac_info[224] = (pos<<4)|len;
\r
}
\r
if (PsndLen_exc_add) len++;
\r
dac_info[224] = (pos<<4)|len;
\r
}
\r
+ for (i = lines; i < sizeof(dac_info) / sizeof(dac_info[0]); i++)
\r
+ dac_info[i] = 0;
\r
//for(i=len=0; i < lines; i++) {
\r
// printf("%03i : %03i : %i\n", i, dac_info[i]>>4, dac_info[i]&0xf);
\r
// len+=dac_info[i]&0xf;
\r
//for(i=len=0; i < lines; i++) {
\r
// printf("%03i : %03i : %i\n", i, dac_info[i]>>4, dac_info[i]&0xf);
\r
// len+=dac_info[i]&0xf;
\r
@@
-100,7
+112,7
@@
PICO_INTERNAL void PsndReset(void)
// also clear the internal registers+addr line
\r
ym2612_regs = YM2612GetRegs();
\r
memset(ym2612_regs, 0, 0x200+4);
\r
// also clear the internal registers+addr line
\r
ym2612_regs = YM2612GetRegs();
\r
memset(ym2612_regs, 0, 0x200+4);
\r
-
z80startCycle = z80stopCycle = 0
;
\r
+
timers_reset()
;
\r
\r
PsndRerate(0);
\r
}
\r
\r
PsndRerate(0);
\r
}
\r
@@
-158,47
+170,31
@@
void PsndRerate(int preserve_state)
\r
// set mixer
\r
PsndMix_32_to_16l = (PicoOpt & POPT_EN_STEREO) ? mix_32_to_16l_stereo : mix_32_to_16_mono;
\r
\r
// set mixer
\r
PsndMix_32_to_16l = (PicoOpt & POPT_EN_STEREO) ? mix_32_to_16l_stereo : mix_32_to_16_mono;
\r
+
\r
+ if (PicoAHW & PAHW_PICO)
\r
+ PicoReratePico();
\r
}
\r
\r
\r
}
\r
\r
\r
-// This is called once per raster (aka line), but not necessarily for every line
\r
-PICO_INTERNAL void Psnd_timers_and_dac(int raster)
\r
+PICO_INTERNAL void PsndDoDAC(int line_to)
\r
{
\r
{
\r
- int pos, len;
\r
- int do_dac = PsndOut && (PicoOpt&POPT_EN_FM) && *ym2612_dacen;
\r
-// int do_pcm = PsndOut && (PicoAHW&1) && (PicoOpt&0x400);
\r
-
\r
- // Our raster lasts 63.61323/64.102564 microseconds (NTSC/PAL)
\r
- YM2612PicoTick(1);
\r
+ int pos, pos1, len;
\r
+ int dout = ym2612.dacout;
\r
+ int line_from = PsndDacLine;
\r
\r
\r
-
if (!do_dac /*&& !do_pcm*/) return
;
\r
+
PsndDacLine = line_to + 1
;
\r
\r
\r
- pos=dac_info[raster], len=pos&0xf;
\r
+ pos =dac_info[line_from]>>4;
\r
+ pos1=dac_info[line_to];
\r
+ len = ((pos1>>4)-pos) + (pos1&0xf);
\r
if (!len) return;
\r
\r
if (!len) return;
\r
\r
- pos>>=4;
\r
-
\r
- if (do_dac)
\r
- {
\r
+ if (PicoOpt & POPT_EN_STEREO) {
\r
short *d = PsndOut + pos*2;
\r
short *d = PsndOut + pos*2;
\r
- int dout = *ym2612_dacout;
\r
- if(PicoOpt&POPT_EN_STEREO) {
\r
- // some manual loop unrolling here :)
\r
- d[0] = dout;
\r
- if (len > 1) {
\r
- d[2] = dout;
\r
- if (len > 2)
\r
- d[4] = dout;
\r
- }
\r
- } else {
\r
- short *d = PsndOut + pos;
\r
- d[0] = dout;
\r
- if (len > 1) {
\r
- d[1] = dout;
\r
- if (len > 2)
\r
- d[2] = dout;
\r
- }
\r
- }
\r
+ for (; len > 0; len--, d+=2) *d = dout;
\r
+ } else {
\r
+ short *d = PsndOut + pos;
\r
+ for (; len > 0; len--, d++) *d = dout;
\r
}
\r
\r
#if 0
\r
}
\r
\r
#if 0
\r
@@
-278,6
+274,11
@@
PICO_INTERNAL void cdda_start_play(void)
cdda_stream = Pico_mcd->TOC.Tracks[i].F;
\r
PicoCDBufferFlush(); // buffering relies on fp not being touched
\r
pm_seek(cdda_stream, lba_offset * 2352, SEEK_SET);
\r
cdda_stream = Pico_mcd->TOC.Tracks[i].F;
\r
PicoCDBufferFlush(); // buffering relies on fp not being touched
\r
pm_seek(cdda_stream, lba_offset * 2352, SEEK_SET);
\r
+ if (Pico_mcd->TOC.Tracks[i].ftype == TYPE_WAV)
\r
+ {
\r
+ // skip headers, assume it's 44kHz stereo uncompressed
\r
+ pm_seek(cdda_stream, 44, SEEK_CUR);
\r
+ }
\r
}
\r
\r
\r
}
\r
\r
\r
@@
-321,6
+322,11
@@
PICO_INTERNAL int PsndRender(int offset, int length)
if (PicoOpt & POPT_EN_PSG)
\r
SN76496Update(PsndOut+offset, length, stereo);
\r
\r
if (PicoOpt & POPT_EN_PSG)
\r
SN76496Update(PsndOut+offset, length, stereo);
\r
\r
+ if (PicoAHW & PAHW_PICO) {
\r
+ PicoPicoPCMUpdate(PsndOut+offset, length, stereo);
\r
+ return length;
\r
+ }
\r
+
\r
// Add in the stereo FM buffer
\r
if (PicoOpt & POPT_EN_FM) {
\r
buf32_updated = YM2612UpdateOne(buf32, length, stereo, 1);
\r
// Add in the stereo FM buffer
\r
if (PicoOpt & POPT_EN_FM) {
\r
buf32_updated = YM2612UpdateOne(buf32, length, stereo, 1);
\r