@@ -33,6 +33,7 @@ typedef uint32_t(*ZNK7android10AudioTrack4dumpEiRKNS_6VectorINS_8String16EEE_t)(
3333static ZNK7android10AudioTrack4dumpEiRKNS_6VectorINS_8String16EEE_t ZNK7android10AudioTrack4dumpEiRKNS_6VectorINS_8String16EEE = nullptr ;
3434typedef status_t (*ZN7android11AudioSystem14listAudioPortsE17audio_port_role_t17audio_port_type_tPjP13audio_port_v7S3_t)(LEGACY_audio_port_role_t, LEGACY_audio_port_type_t, unsigned int *, void *, unsigned int *);
3535static ZN7android11AudioSystem14listAudioPortsE17audio_port_role_t17audio_port_type_tPjP13audio_port_v7S3_t ZN7android11AudioSystem14listAudioPortsE17audio_port_role_t17audio_port_type_tPjP13audio_port_v7S3_ = nullptr ;
36+ static int gSampleRateOffset = 0 ;
3637
3738bool initLib (JNIEnv* env) {
3839 if (init_done)
@@ -245,20 +246,32 @@ Java_org_akanework_gramophone_logic_utils_AfFormatTracker_00024Companion_findAfF
245246 }
246247 }
247248 }
249+ if (gSampleRateOffset == 0 && sampleRate == 0 ) {
250+ __android_log_print (ANDROID_LOG_ERROR, LOG_TAG,
251+ " wrong usage of findAfFlagsForPortInternal: not calibrated and sampleRate is 0" );
252+ return INT32_MAX;
253+ }
248254#define BUFFER_SIZE 114000
249255 auto buffer = (uint8_t *) calloc (1 , BUFFER_SIZE); // should be plenty
250256 *((int * /* audio_port_handle_t*/ ) buffer) = id;
251257 ZN7android11AudioSystem12getAudioPortEP13audio_port_v7 (buffer);
252258 uint8_t *pos = buffer + BUFFER_SIZE;
253- while (buffer < pos) {
254- pos -= sizeof (unsigned int ) / sizeof (uint8_t );
255- if (buffer < pos && *((unsigned int *) pos) == sampleRate)
256- break ;
257- }
259+ if (gSampleRateOffset == 0 ) {
260+ while (buffer < pos) {
261+ pos -= sizeof (unsigned int ) / sizeof (uint8_t );
262+ if (buffer < pos && *((unsigned int *) pos) == sampleRate)
263+ break ;
264+ }
265+ if (buffer < pos)
266+ gSampleRateOffset = pos - buffer;
267+ } else {
268+ pos += gSampleRateOffset ;
269+ }
258270 if (buffer >= pos) {
259271 __android_log_print (ANDROID_LOG_ERROR, LOG_TAG,
260272 " buffer(%p) >= pos(%p) (BUFFER_SIZE(%d))" , buffer, pos,
261273 BUFFER_SIZE);
274+ gSampleRateOffset = 0 ;
262275 return INT32_MIN;
263276 }
264277 /*
@@ -278,7 +291,7 @@ Java_org_akanework_gramophone_logic_utils_AfFormatTracker_00024Companion_findAfF
278291 __android_log_print (ANDROID_LOG_ERROR, LOG_TAG,
279292 " pos(%p) >= buffer(%p) + BUFFER_SIZE(%d)" , pos, buffer,
280293 BUFFER_SIZE);
281- return INT32_MAX ;
294+ return INT32_MIN ;
282295 }
283296#undef BUFFER_SIZE
284297 return (int32_t ) (*((uint32_t * /* audio_io_flags / audio_channel_mask_t*/ ) pos));
0 commit comments