plugins: midi: remove HW_SAMPR_CAPS usage
rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
| Newsgroups | gmane.comp.systems.archos.rockbox.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 9c708e3876b4d2ad76893144f3cb8348e3fbbb0f Author: mojyack <[email protected]> Date: Fri Feb 13 16:53:25 2026 +0900 plugins: midi: remove HW_SAMPR_CAPS usage Change-Id: Ie4962cf6d4f2f9078fa348f8f6f638cfbc0047a5 diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index 2689e96ba1..012169a02e 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -381,6 +381,8 @@ struct MIDIfile * mf IBSS_ATTR; +int sample_rate IBSS_ATTR; +int max_voices IBSS_ATTR; int number_of_samples IBSS_ATTR; /* the number of samples in the current tick */ int playing_time IBSS_ATTR; /* How many seconds into the file have we been playing? */ int samples_this_second IBSS_ATTR; /* How many samples produced during this second so far? */ @@ -490,11 +492,61 @@ static void get_more(const void** start, size_t* size) *size = samples_in_buf*sizeof(int32_t); } +static const struct mixer_play_cbs mixer_cbs = { + .get_more = get_more, + /* TODO: update sample_rate and max_voices on sampr_changed() */ +}; + +UNUSED_ATTR static int find_min_sampr_ge_22(void) +{ + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); + int ret = caps->samprs[0]; + for (size_t i = 1; i < caps->num_samprs; i += 1) + { + /* caps->samprs is in descending order */ + if (caps->samprs[i] >= SAMPR_22) + ret = caps->samprs[i]; + else + break; + } + return ret; +} + static int midimain(const void * filename) { int a, notes_used, vol; bool is_playing = true; /* false = paused */ + /* decide sample_rate and max_voices */ +#if defined(SIMULATOR) /* Simulator requires 44100Hz, and we can afford to use more voices */ || \ + (CONFIG_PLATFORM & PLATFORM_HOSTED) /* All hosted targets have CPU to spare */ || \ + defined(CPU_MIPS) /* All MIPS targets are pretty fast */ + sample_rate = SAMPR_44; + max_voices = 48; +#elif defined(CPU_PP) + /* Some of the pp based targets can't handle too many voices + mainly because they have to use 44100Hz sample rate, this could be + improved to increase max_voices for targets that can do 22kHz */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#elif defined(CPU_ARM) + /* ARMv4 targets are slow, but treat everything else as fast */ +#if (ARM_ARCH >= 6) + sample_rate = SAMPR_44; + max_voices = 32; +#elif (ARM_ARCH >= 5) + sample_rate = find_min_sampr_ge_22(); + max_voices = 32; +#else /* ie v4 */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#endif +#else /* !CPU_ARM */ + /* Treat everything else as slow */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#endif + #if defined(HAVE_ADJUSTABLE_CPU_FREQ) rb->cpu_boost(true); #endif @@ -537,7 +589,7 @@ static int midimain(const void * filename) rb->dsp_set_timestretch(PITCH_SPEED_100); #endif rb->dsp_configure(dsp, DSP_SET_SAMPLE_DEPTH, 22); - rb->dsp_configure(dsp, DSP_SET_FREQUENCY, SAMPLE_RATE); /* 44100 22050 11025 */ + rb->dsp_configure(dsp, DSP_SET_FREQUENCY, sample_rate); /* 44100 22050 11025 */ rb->dsp_configure(dsp, DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); /* @@ -553,14 +605,14 @@ static int midimain(const void * filename) midi_debug("Okay, starting sequencing"); bpm = mf->div*1000000/tempo; - number_of_samples = SAMPLE_RATE/bpm; + number_of_samples = sample_rate/bpm; /* Skip over any junk in the beginning of the file, so start playing */ /* after the first note event */ do { notes_used = 0; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].isUsed) notes_used++; tick(); diff --git a/apps/plugins/midi/midiutil.c b/apps/plugins/midi/midiutil.c index b9e57a405b..7438455ca3 100644 --- a/apps/plugins/midi/midiutil.c +++ b/apps/plugins/midi/midiutil.c @@ -35,7 +35,7 @@ struct GPatch * gusload(char *); struct GPatch * patchSet[128]; struct GPatch * drumSet[128]; -struct SynthObject voices[MAX_VOICES] IBSS_ATTR; +struct SynthObject voices[48] IBSS_ATTR; static void *alloc(int size) { diff --git a/apps/plugins/midi/midiutil.h b/apps/plugins/midi/midiutil.h index ee9769b108..71da7461e3 100644 --- a/apps/plugins/midi/midiutil.h +++ b/apps/plugins/midi/midiutil.h @@ -27,67 +27,6 @@ #define NBUF 2 #define MAX_SAMPLES 512 -#ifdef SIMULATOR - -/* Simulator requires 44100Hz, and we can afford to use more voices */ -#define SAMPLE_RATE SAMPR_44 -#define MAX_VOICES 48 - -#elif (CONFIG_PLATFORM & PLATFORM_HOSTED) - -/* All hosted targets have CPU to spare */ -#define MAX_VOICES 48 -#define SAMPLE_RATE SAMPR_44 - -#elif defined(CPU_PP) - -/* Some of the pp based targets can't handle too many voices - mainly because they have to use 44100Hz sample rate, this could be - improved to increase MAX_VOICES for targets that can do 22kHz */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif - -#elif defined(CPU_MIPS) - -/* All MIPS targets are pretty fast */ -#define MAX_VOICES 48 -#define SAMPLE_RATE SAMPR_44 - -#elif defined(CPU_ARM) - -/* ARMv4 targets are slow, but treat everything else as fast */ - -#if (ARM_ARCH >= 6) -#define MAX_VOICES 32 -#define SAMPLE_RATE SAMPR_44 -#elif (ARM_ARCH >= 5) -#define MAX_VOICES 32 -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#else /* ie v4 */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif -#endif /* ARM_ARCH < 5*/ - -#else /* !CPU_ARM */ - -/* Treat everything else as slow */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif - -#endif /* Wrap it up. */ - #define BYTE unsigned char /* Data chunk ID types, returned by readID() */ @@ -189,7 +128,7 @@ void * readData(int file, int len); #define malloc(n) my_malloc(n) void * my_malloc(int size); -extern struct SynthObject voices[MAX_VOICES]; +extern struct SynthObject voices[48]; /* 48: maximum possible max_voices */ extern int chVol[16]; /* Channel volume */ extern int chPan[16]; /* Channel panning */ @@ -207,6 +146,8 @@ extern struct GPatch * drumSet[128]; extern struct MIDIfile * mf; +extern int sample_rate; +extern int max_voices; extern int number_of_samples; extern int playing_time IBSS_ATTR; extern int samples_this_second IBSS_ATTR; diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c index d35a057c32..ce4aa6628a 100644 --- a/apps/plugins/midi/sequencer.c +++ b/apps/plugins/midi/sequencer.c @@ -65,7 +65,7 @@ static inline void setVol(int ch, int vol) /* If channel volume changes, we need to recalculate the volume scale */ /* factor for all voices active on this channel */ - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].ch == ch) setVolScale(a); } @@ -156,7 +156,7 @@ static void findDelta(struct SynthObject * so, int ch, int note) delta = (((freqtable[note+chPBNoteOffset[ch]]))); /* anywhere from 8000 to 8000000 */ delta = delta * wf->sampRate; /* approx 20000 - 44000 but can vary with tuning */ delta = (delta * chPBFractBend[ch]); /* approx 60000 - 70000 */ - delta = delta / (SAMPLE_RATE); /* 44100 or 22050 */ + delta = delta / (sample_rate); /* 44100 or 22050 */ delta = delta / (wf->rootFreq); /* anywhere from 8000 to 8000000 */ /* Pitch bend is encoded as a fractional of 16 bits, hence the 16 */ @@ -167,7 +167,7 @@ static void findDelta(struct SynthObject * so, int ch, int note) static inline void computeDeltas(int ch) { int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].isUsed && voices[a].ch == ch) { @@ -210,7 +210,7 @@ static inline void pressNote(int ch, int note, int vol) if(ch == 15) return; */ int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].ch == ch && voices[a].note == note) break; @@ -218,7 +218,7 @@ static inline void pressNote(int ch, int note, int vol) if (!voices[a].isUsed) break; } - if (a == MAX_VOICES) + if (a == max_voices) { // midi_debug("\nVoice kill"); // midi_debug("\nToo many voices playing at once. No more left"); @@ -226,7 +226,7 @@ static inline void pressNote(int ch, int note, int vol) // for(a=0; a<48; a++) // midi_debug("\n#%d Ch=%d Note=%d curRate=%d curOffset=%d curPoint=%d targetOffset=%d", a, voices[a].ch, voices[a].note, voices[a].curRate, voices[a].curOffset, voices[a].curPoint, voices[a].targetOffset); lastKill++; - if (lastKill == MAX_VOICES) + if (lastKill == max_voices) lastKill = 0; a = lastKill; // return; /* None available */ @@ -263,7 +263,7 @@ static inline void pressNote(int ch, int note, int vol) struct GWaveform * wf = drumSet[note]->waveforms[0]; voices[a].wf = wf; - voices[a].delta = (((freqtable[note]<<FRACTSIZE) / wf->rootFreq) * wf->sampRate / SAMPLE_RATE); + voices[a].delta = (((freqtable[note]<<FRACTSIZE) / wf->rootFreq) * wf->sampRate / sample_rate); if (wf->mode & 28) // midi_debug("\nWoah, a drum patch has a loop. Stripping the loop..."); wf->mode = wf->mode & (255-28); @@ -285,7 +285,7 @@ static void releaseNote(int ch, int note) return; int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].ch == ch && voices[a].note == note) { @@ -432,7 +432,7 @@ int tick(void) tempo = (((short)e->evData[0])<<16)|(((short)e->evData[1])<<8)|(e->evData[2]); /* midi_debug("\nMeta-Event: Tempo Set = %d", tempo); */ bpm=mf->div*1000000/tempo; - number_of_samples=SAMPLE_RATE/bpm; + number_of_samples=sample_rate/bpm; } } @@ -446,9 +446,9 @@ int tick(void) samples_this_second += number_of_samples; - while (samples_this_second >= SAMPLE_RATE) + while (samples_this_second >= sample_rate) { - samples_this_second -= SAMPLE_RATE; + samples_this_second -= sample_rate; playing_time++; } @@ -471,7 +471,7 @@ void seekBackward(int nsec) /* Set the tempo to defalt */ bpm = mf->div*1000000/tempo; - number_of_samples = SAMPLE_RATE/bpm; + number_of_samples = sample_rate/bpm; /* Reset the tracks to start */ rewindFile(); @@ -484,7 +484,7 @@ void seekBackward(int nsec) do { notes_used = 0; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].isUsed) notes_used++; tick(); diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index f199d544e5..3143e61a4f 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c @@ -46,7 +46,7 @@ static void readTextBlock(int file, char * buf) void resetControllers() { int a=0; - for(a=0; a<MAX_VOICES; a++) + for(a=0; a<max_voices; a++) { voices[a].cp=0; voices[a].vol=0; @@ -448,13 +448,13 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i size_t synthSamples(int32_t *buf_ptr, size_t num_samples) ICODE_ATTR; size_t synthSamples(int32_t *buf_ptr, size_t num_samples) { - unsigned int i; + int i; struct SynthObject *voicept; size_t nsamples = MIN(num_samples, MAX_SAMPLES); rb->memset(buf_ptr, 0, nsamples * 2 * sizeof(int32_t)); - for(i=0; i < MAX_VOICES; i++) + for(i=0; i < max_voices; i++) { voicept=&voices[i]; if(voicept->isUsed) -- rockbox-cvs mailing list [email protected] https://lists.haxx.se/mailman/listinfo/rockbox-cvs