mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
audio improvement wip
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@33 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
f80d67e12b
commit
85f8e92973
11 changed files with 65 additions and 27 deletions
|
@ -227,6 +227,7 @@ void sound_clear(void)
|
|||
|
||||
int sound_render(int offset, int length)
|
||||
{
|
||||
int buf32_updated = 0;
|
||||
int *buf32 = PsndBuffer+offset;
|
||||
int stereo = (PicoOpt & 8) >> 3;
|
||||
// emulating CD && PCM option enabled && PCM chip on && have enabled channels
|
||||
|
@ -248,11 +249,15 @@ int sound_render(int offset, int length)
|
|||
|
||||
// Add in the stereo FM buffer
|
||||
if (PicoOpt & 1)
|
||||
YM2612UpdateOne(buf32, length, stereo, 1);
|
||||
buf32_updated = YM2612UpdateOne(buf32, length, stereo, 1);
|
||||
|
||||
//printf("active_chs: %02x\n", buf32_updated);
|
||||
|
||||
// CD: PCM sound
|
||||
if (do_pcm)
|
||||
if (do_pcm) {
|
||||
pcm_update(buf32, length, stereo);
|
||||
//buf32_updated = 1;
|
||||
}
|
||||
|
||||
// CD: CDDA audio
|
||||
if ((PicoMCD & 1) && (PicoOpt & 0x800))
|
||||
|
|
|
@ -841,7 +841,7 @@ typedef struct
|
|||
UINT32 eg_timer;
|
||||
UINT32 eg_timer_add;
|
||||
UINT32 pack; // 4c: stereo, lastchan, disabled, lfo_enabled | pan_r, pan_l, ams[2] | AMmasks[4] | FB[4] | lfo_ampm[16]
|
||||
UINT32 algo; /* 50 */
|
||||
UINT32 algo; /* 50: algo[3], was_update */
|
||||
INT32 op1_out;
|
||||
} chan_rend_context;
|
||||
|
||||
|
@ -1077,6 +1077,7 @@ static void chan_render_loop(chan_rend_context *ct, int *buffer, int length)
|
|||
} else {
|
||||
buffer[scounter] += smp;
|
||||
}
|
||||
ct->algo = 8; // algo is only used in asm, here only bit3 is used
|
||||
}
|
||||
|
||||
/* update phase counters AFTER output calculations */
|
||||
|
@ -1091,7 +1092,7 @@ void chan_render_loop(chan_rend_context *ct, int *buffer, unsigned short length)
|
|||
#endif
|
||||
|
||||
|
||||
static void chan_render(int *buffer, int length, FM_CH *CH, UINT32 flags) // flags: stereo, lastchan, disabled, ?, pan_r, pan_l
|
||||
static int chan_render(int *buffer, int length, FM_CH *CH, UINT32 flags) // flags: stereo, lastchan, disabled, ?, pan_r, pan_l
|
||||
{
|
||||
chan_rend_context ct;
|
||||
|
||||
|
@ -1193,6 +1194,8 @@ static void chan_render(int *buffer, int length, FM_CH *CH, UINT32 flags) // fla
|
|||
CH->SLOT[SLOT3].phase = ct.phase3;
|
||||
CH->SLOT[SLOT4].phase = ct.phase4;
|
||||
CH->mem_value = ct.mem;
|
||||
|
||||
return (ct.algo & 8) >> 3; // had output
|
||||
}
|
||||
|
||||
/* update phase increment and envelope generator */
|
||||
|
@ -1587,6 +1590,7 @@ INT32 *ym2612_dacout;
|
|||
int YM2612UpdateOne_(int *buffer, int length, int stereo, int is_buf_empty)
|
||||
{
|
||||
int pan;
|
||||
int active_chs = 0;
|
||||
|
||||
// if !is_buf_empty, it means it has valid samples to mix with, else it may contain trash
|
||||
if (is_buf_empty) memset32(buffer, 0, length<<stereo);
|
||||
|
@ -1613,14 +1617,15 @@ int YM2612UpdateOne_(int *buffer, int length, int stereo, int is_buf_empty)
|
|||
if (stereo) stereo = 1;
|
||||
|
||||
/* mix to 32bit dest */
|
||||
chan_render(buffer, length, &ym2612.CH[0], stereo|((pan&0x003)<<4)); // flags: stereo, lastchan, disabled, ?, pan_r, pan_l
|
||||
chan_render(buffer, length, &ym2612.CH[1], stereo|((pan&0x00c)<<2));
|
||||
chan_render(buffer, length, &ym2612.CH[2], stereo|((pan&0x030) ));
|
||||
chan_render(buffer, length, &ym2612.CH[3], stereo|((pan&0x0c0)>>2));
|
||||
chan_render(buffer, length, &ym2612.CH[4], stereo|((pan&0x300)>>4));
|
||||
chan_render(buffer, length, &ym2612.CH[5], stereo|((pan&0xc00)>>6)|(ym2612.dacen<<2)|2);
|
||||
// flags: stereo, lastchan, disabled, ?, pan_r, pan_l
|
||||
active_chs |= chan_render(buffer, length, &ym2612.CH[0], stereo|((pan&0x003)<<4)) << 0;
|
||||
active_chs |= chan_render(buffer, length, &ym2612.CH[1], stereo|((pan&0x00c)<<2)) << 1;
|
||||
active_chs |= chan_render(buffer, length, &ym2612.CH[2], stereo|((pan&0x030) )) << 2;
|
||||
active_chs |= chan_render(buffer, length, &ym2612.CH[3], stereo|((pan&0x0c0)>>2)) << 3;
|
||||
active_chs |= chan_render(buffer, length, &ym2612.CH[4], stereo|((pan&0x300)>>4)) << 4;
|
||||
active_chs |= chan_render(buffer, length, &ym2612.CH[5], stereo|((pan&0xc00)>>6)|(ym2612.dacen<<2)|2) << 5;
|
||||
|
||||
return 1; // buffer updated
|
||||
return active_chs; // 1 if buffer updated
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ void *YM2612GetRegs(void);
|
|||
#define YM2612PicoStateLoad YM2612PicoStateLoad_
|
||||
#else
|
||||
/* GP2X specific */
|
||||
#include "../../platform/gp2x/940ctl_ym2612.h"
|
||||
#include "../../platform/gp2x/940ctl.h"
|
||||
extern int PicoOpt;
|
||||
#define YM2612Init(baseclock,rate) { \
|
||||
if (PicoOpt&0x200) YM2612Init_940(baseclock, rate); \
|
||||
|
@ -172,10 +172,9 @@ extern int PicoOpt;
|
|||
if (PicoOpt&0x200) YM2612ResetChip_940(); \
|
||||
else YM2612ResetChip_(); \
|
||||
}
|
||||
#define YM2612UpdateOne(buffer,length,stereo,is_buf_empty) { \
|
||||
if (PicoOpt&0x200) YM2612UpdateOne_940(buffer, length, stereo, is_buf_empty); \
|
||||
else YM2612UpdateOne_(buffer, length, stereo, is_buf_empty); \
|
||||
}
|
||||
#define YM2612UpdateOne(buffer,length,stereo,is_buf_empty) \
|
||||
(PicoOpt&0x200) ? YM2612UpdateOne_940(buffer, length, stereo, is_buf_empty) : \
|
||||
YM2612UpdateOne_(buffer, length, stereo, is_buf_empty);
|
||||
#define YM2612Write(a,v) \
|
||||
(PicoOpt&0x200) ? YM2612Write_940(a, v) : YM2612Write_(a, v)
|
||||
#define YM2612Read() \
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
@ it does not seem to give much performance increase (if any at all), so don't use it if it causes trouble.
|
||||
@ - notaz, 2006
|
||||
|
||||
@ vim:filetype=armasm
|
||||
|
||||
.equiv SLOT1, 0
|
||||
.equiv SLOT2, 2
|
||||
.equiv SLOT3, 1
|
||||
|
@ -725,7 +727,7 @@ upd_slot1:
|
|||
|
||||
|
||||
@ lr=context, r12=pack (stereo, lastchan, disabled, lfo_enabled | pan_r, pan_l, ams[2] | AMmasks[4] | FB[4] | lfo_ampm[16])
|
||||
@ r0-r2=scratch, r3=sin_tab/scratch, r4=(length<<8)|algo, r5=tl_tab/slot,
|
||||
@ r0-r2=scratch, r3=sin_tab/scratch, r4=(length<<8)|unused[4],was_update,algo[3], r5=tl_tab/slot,
|
||||
@ r6-r7=vol_out[4], r8=eg_timer, r9=eg_timer_add[31:16], r10=op1_out, r11=buffer
|
||||
.global chan_render_loop @ chan_rend_context *ct, int *buffer, int length
|
||||
|
||||
|
@ -856,6 +858,7 @@ crl_algo_done:
|
|||
@ -- WRITE SAMPLE --
|
||||
tst r0, r0
|
||||
beq ctl_sample_skip
|
||||
orr r4, r4, #8 @ have_output
|
||||
tst r12, #1
|
||||
beq ctl_sample_mono
|
||||
|
||||
|
@ -908,6 +911,7 @@ crl_do_phase:
|
|||
crl_loop_end:
|
||||
str r8, [lr, #0x44] @ eg_timer
|
||||
str r12, [lr, #0x4c] @ pack (for lfo_ampm)
|
||||
str r4, [lr, #0x50] @ was_update
|
||||
str r10, [lr, #0x54] @ op1_out
|
||||
ldmfd sp!, {r4-r11,pc}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue