Skip to content

Commit 09dded1

Browse files
committed
handle error by returning null
1 parent 8d7ec57 commit 09dded1

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

app/src/main/cpp/gramophone.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ typedef uint32_t(*ZNK7android10AudioTrack4dumpEiRKNS_6VectorINS_8String16EEE_t)(
3333
static ZNK7android10AudioTrack4dumpEiRKNS_6VectorINS_8String16EEE_t ZNK7android10AudioTrack4dumpEiRKNS_6VectorINS_8String16EEE = nullptr;
3434
typedef 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*);
3535
static 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

3738
bool 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));

app/src/main/kotlin/org/akanework/gramophone/logic/utils/AfFormatTracker.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,11 @@ class AfFormatTracker(
467467
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
468468
return null // need listAudioPorts or getAudioPort
469469
return try {
470-
findAfFlagsForPortInternal(id, sr, isForChannels)
470+
findAfFlagsForPortInternal(id, sr, isForChannels).let {
471+
if (it == Int.MAX_VALUE || it == Int.MIN_VALUE)
472+
null // something went wrong, this was logged to logcat
473+
else it
474+
}
471475
} catch (e: Throwable) {
472476
Log.e(TAG, Log.getStackTraceString(e))
473477
null

0 commit comments

Comments
 (0)