Skip to content

Commit

Permalink
Add psgplay_digital_to_stereo_callback
Browse files Browse the repository at this point in the history
  • Loading branch information
frno7 committed Sep 11, 2022
1 parent 4b81c6a commit 5aee9e3
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
32 changes: 32 additions & 0 deletions include/psgplay/stereo.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,36 @@ struct psgplay_stereo {
ssize_t psgplay_read_stereo(struct psgplay *pp,
struct psgplay_stereo *buffer, size_t count);

/**
* psgplay_digital_to_stereo_cb - callback type to transform digital samples
* into stereo samples
* @stereo: stereo samples
* @digital: digital samples
* @count: number of stereo samples to transform into digital samples
* @arg: argument supplied to psgplay_digital_to_stereo_callback()
*/
typedef void (*psgplay_digital_to_stereo_cb)(
struct psgplay_stereo *stereo, const struct psgplay_digital *digital,
size_t count, void *arg);

/**
* psgplay_digital_to_stereo_linear - linear stereo mix of digital samples
* @stereo: stereo samples
* @digital: digital samples
* @count: number of stereo samples to transform into digital samples
* @arg: ignored, can be %NULL
*/
void psgplay_digital_to_stereo_linear(struct psgplay_stereo *stereo,
const struct psgplay_digital *digital, size_t count, void *arg);

/**
* psgplay_digital_to_stereo_callback - invoke callback to transform digital
* samples into stereo samples
* @pp: PSG play object
* @cb: callback
* @arg: optional argument supplied to @cb, can be %NULL
*/
void psgplay_digital_to_stereo_callback(struct psgplay *pp,
const psgplay_digital_to_stereo_cb cb, void *arg);

#endif /* PSGPLAY_STEREO_H */
2 changes: 2 additions & 0 deletions lib/psgplay/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ LIBPSGPLAY_WEB_FUNCTIONS = \
_psgplay_init \
_psgplay_read_stereo \
_psgplay_read_digital \
_psgplay_digital_to_stereo_callback \
_psgplay_digital_to_stereo_linear \
_psgplay_free \
_ice_identify \
_ice_crunched_size \
Expand Down
20 changes: 18 additions & 2 deletions lib/psgplay/psgplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ struct psgplay {
} lowpass;
} downsample;

struct {
psgplay_digital_to_stereo_cb cb;
void *arg;
} digital_to_stereo_callback;

const struct machine *machine;

struct {
Expand Down Expand Up @@ -207,7 +212,7 @@ static s16 psg_dac(const u8 level)
return (level < 16 ? dac[level] : 0xffff) - 0x8000;
}

static void digital_to_stereo(struct psgplay_stereo *stereo,
void psgplay_digital_to_stereo_linear(struct psgplay_stereo *stereo,
const struct psgplay_digital *digital, size_t count, void *arg)
{
for (size_t i = 0; i < count; i++) {
Expand All @@ -226,6 +231,13 @@ static void digital_to_stereo(struct psgplay_stereo *stereo,
}
}

void psgplay_digital_to_stereo_callback(struct psgplay *pp,
const psgplay_digital_to_stereo_cb cb, void *arg)
{
pp->digital_to_stereo_callback.cb = cb;
pp->digital_to_stereo_callback.arg = arg;
}

static size_t stereo_downsample(struct psgplay_stereo *resample,
const struct psgplay_stereo *stereo, size_t count, void *arg)
{
Expand Down Expand Up @@ -258,7 +270,8 @@ static void digital_to_stereo_downsample(struct psgplay *pp,
while (i < count && !pp->errno_) {
const size_t n = min(count - i, ARRAY_SIZE(stereo));

digital_to_stereo(stereo, &digital[i], n, NULL);
pp->digital_to_stereo_callback.cb(stereo, &digital[i], n,
pp->digital_to_stereo_callback.arg);

const size_t r = stereo_downsample(
resample, stereo, n, &pp->downsample);
Expand Down Expand Up @@ -340,6 +353,9 @@ struct psgplay *psgplay_init(const void *data, size_t size,
pp->machine = &atari_st;
pp->machine->init(data, size, offset, &regs, &ports);

psgplay_digital_to_stereo_callback(pp,
psgplay_digital_to_stereo_linear, NULL);

return pp;
}

Expand Down

0 comments on commit 5aee9e3

Please sign in to comment.