Skip to content

Commit 9ed882b

Browse files
committed
misc edits
1 parent 0ca1fe4 commit 9ed882b

File tree

4 files changed

+30
-18
lines changed

4 files changed

+30
-18
lines changed

app/src/main/java/uk/akane/libphonograph/reader/Reader.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.net.Uri
77
import android.os.Build
88
import android.os.Bundle
99
import android.provider.MediaStore
10+
import androidx.core.database.getStringOrNull
1011
import androidx.media3.common.HeartRating
1112
import androidx.media3.common.MediaItem
1213
import androidx.media3.common.MediaMetadata
@@ -56,6 +57,7 @@ internal object Reader {
5657
private val projection =
5758
arrayListOf(
5859
MediaStore.Audio.Media._ID,
60+
MediaStore.Audio.Media.DISPLAY_NAME,
5961
MediaStore.Audio.Media.TITLE,
6062
MediaStore.Audio.Media.ARTIST,
6163
MediaStore.Audio.Media.ARTIST_ID,
@@ -209,6 +211,7 @@ internal object Reader {
209211
cursor?.use {
210212
// Get columns from mediaStore.
211213
val idColumn = it.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)
214+
val fileName = it.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)
212215
val titleColumn = it.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)
213216
val artistColumn = it.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)
214217
val albumColumn = it.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)
@@ -245,7 +248,7 @@ internal object Reader {
245248
val duration =
246249
it.getLongOrNullIfThrow(durationColumn)?.let { if (it >= 0) it else null }
247250
val pathFile = path?.let { it1 -> File(it1) }
248-
val parent = pathFile?.parentFile
251+
val parent = pathFile?.parentFile?.takeIf { it.absolutePath != "/" }
249252
val fldPath = parent?.absolutePath
250253
var isBlacklisted = false
251254
if (blackListSet.isNotEmpty()) {
@@ -263,8 +266,8 @@ internal object Reader {
263266
|| isBlacklisted)
264267
// We need to add blacklisted songs to idMap as they can be referenced by playlist
265268
if (skip && idMap == null && pathMap == null) continue
266-
val id = it.getLongOrNullIfThrow(idColumn)!!
267-
val title = it.getStringOrNullIfThrow(titleColumn)!!
269+
val id = it.getLong(idColumn)
270+
val title = it.getString(titleColumn) ?: path ?: it.getString(fileName)!!
268271
val artist: String?
269272
val hasNoMetadata: Boolean
270273
it.getStringOrNullIfThrow(artistColumn).let {
@@ -276,7 +279,7 @@ internal object Reader {
276279
val year = it.getIntOrNullIfThrow(yearColumn).let { v -> if (v == 0) null else v }
277280
val albumId = it.getLongOrNullIfThrow(albumIdColumn)
278281
val artistId = it.getLongOrNullIfThrow(artistIdColumn)
279-
val mimeType = it.getStringOrNullIfThrow(mimeTypeColumn)!!
282+
val mimeType = it.getStringOrNull(mimeTypeColumn) // is null for directories
280283
var discNumber = discNumberColumn?.let { col -> it.getIntOrNullIfThrow(col) }
281284
var trackNumber = it.getIntOrNullIfThrow(trackNumberColumn)
282285
var cdTrackNumber =

hificore/src/main/cpp/gramophone.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ Java_org_nift4_gramophone_hificore_AudioSystemHiddenApi_findAfFlagsForPortIntern
289289
JNIEnv *env, jobject, jint id, jint io) {
290290
if (!initLib(env))
291291
return nullptr;
292-
jint out[6] = { 0, 0, 0, 0, 0, 0 };
292+
jint out[7] = { 0, 0, 0, 0, 0, 0, 0 };
293293
if (android_get_device_api_level() >= 28) {
294294
DLSYM_OR_ELSE(libaudioclient, ZN7android11AudioSystem12getAudioPortEP13audio_port_v7) {
295295
ZN7android11AudioSystem12getAudioPortEP13audio_port_v7 =
@@ -354,7 +354,8 @@ Java_org_nift4_gramophone_hificore_AudioSystemHiddenApi_findAfFlagsForPortIntern
354354
out[5] = (int32_t) (*((uint32_t *) maxPos)); // port.ext.mix.latency_class
355355
}
356356
/*
357-
* unsigned int sample_rate; <--- we want to go here
357+
* unsigned int config_mask; <--- we want to go until here
358+
* unsigned int sample_rate;
358359
* audio_channel_mask_t channel_mask;
359360
* audio_format_t format;
360361
* struct audio_gain_config gain;
@@ -376,6 +377,8 @@ Java_org_nift4_gramophone_hificore_AudioSystemHiddenApi_findAfFlagsForPortIntern
376377
out[1] = (int32_t) (*((uint32_t *) pos));
377378
pos -= sizeof(unsigned int) / sizeof(uint8_t); // unsigned int (sample_rate)
378379
out[0] = (int32_t) (*((uint32_t *) pos));
380+
pos -= sizeof(unsigned int) / sizeof(uint8_t); // unsigned int (config_mask)
381+
out[6] = (int32_t) (*((uint32_t *) pos));
379382
free(buffer);
380383
} else {
381384
DLSYM_OR_ELSE(libaudioclient, ZN7android11AudioSystem14listAudioPortsE17audio_port_role_t17audio_port_type_tPjP13audio_port_v7S3_) {
@@ -464,6 +467,7 @@ Java_org_nift4_gramophone_hificore_AudioSystemHiddenApi_findAfFlagsForPortIntern
464467
// out[3] / port.active_config.flags missing in action
465468
out[4] = (int32_t) port.active_config.ext.mix.hw_module;
466469
out[5] = (int32_t) port.ext.mix.latency_class;
470+
out[6] = (int32_t) port.active_config.config_mask;
467471
found = true;
468472
break;
469473
}
@@ -479,6 +483,7 @@ Java_org_nift4_gramophone_hificore_AudioSystemHiddenApi_findAfFlagsForPortIntern
479483
// out[3] / port.active_config.flags missing in action
480484
out[4] = (int32_t) port.active_config.ext.mix.hw_module;
481485
out[5] = (int32_t) port.ext.mix.latency_class;
486+
out[6] = (int32_t) port.active_config.config_mask;
482487
found = true;
483488
break;
484489
}

hificore/src/main/java/org/nift4/gramophone/hificore/AudioSystemHiddenApi.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ object AudioSystemHiddenApi {
7777
}
7878

7979
fun getFormat(output: Int): UInt? {
80+
// TODO: isn't this kind of exactly the same thing as the mixport format??
8081
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
8182
TODO("use AudioSystem::getIoDescriptor instead of hardcoded binder numbers")
8283
val af = getAfService() ?: return null
@@ -173,19 +174,22 @@ object AudioSystemHiddenApi {
173174
val ioHandle = port.javaClass.getMethod("ioHandle").invoke(port) as Int
174175
val id = port.javaClass.getMethod("id").invoke(port) as Int
175176
val name = port.javaClass.getMethod("name").invoke(port) as String?
177+
// if audio profiles are ever parsed here, prefer to use the native version because S+ JNI
178+
// conversion code adds float profiles to java objects for backwards compatibility with R.
176179
val mixPortData = getMixPortMetadata(id, ioHandle)
180+
val validFlags = mixPortData?.get(6) ?: 0
177181
// flags exposed to app process since below commit which first appeared in T release.
178182
// https://cs.android.com/android/_/android/platform/frameworks/av/+/99809024b36b243ad162c780c1191bb503a8df47
179183
// https://cs.android.com/android/_/android/platform/frameworks/av/+/0805de160715e82fcf59f9367a43b96a352abd11
180184
return MixPort(
181185
id,
182186
ioHandle,
183187
name,
184-
flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
185-
mixPortData?.get(3) else null,
186-
channelMask = mixPortData?.get(2),
187-
format = mixPortData?.get(1)?.toUInt(),
188-
sampleRate = mixPortData?.get(0)?.toUInt(),
188+
flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
189+
(validFlags and 0x10) != 0) mixPortData?.get(3) else null,
190+
channelMask = if ((validFlags and 0x2) != 0) mixPortData?.get(2) else null,
191+
format = if ((validFlags and 0x4) != 0) mixPortData?.get(1)?.toUInt() else null,
192+
sampleRate = if ((validFlags and 0x1) != 0) mixPortData?.get(0)?.toUInt() else null,
189193
hwModule = mixPortData?.get(4),
190194
fast = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
191195
mixPortData?.let { it[5] == 0 } else null)

hificore/src/main/java/org/nift4/gramophone/hificore/NativeTrack.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,19 +1083,19 @@ class NativeTrack(
10831083
@RequiresApi(Build.VERSION_CODES.M)
10841084
private external fun getOriginalSampleRateInternal(ptr: Long): Int
10851085

1086-
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) // TODO qpr
1086+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
10871087
fun getHalSampleRate(): UInt {
1088-
TODO()
1088+
return AudioTrackHiddenApi.getHalSampleRate(proxy!!) ?: 0u
10891089
}
10901090

1091-
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) // TODO qpr
1092-
fun getHalChannelCount(): UInt {
1093-
TODO()
1091+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1092+
fun getHalChannelCount(): Int {
1093+
return AudioTrackHiddenApi.getHalChannelCount(proxy!!) ?: 0
10941094
}
10951095

1096-
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) // TODO qpr
1096+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
10971097
fun getHalFormat(): UInt {
1098-
TODO()
1098+
return AudioTrackHiddenApi.getHalFormat(proxy!!) ?: 0u
10991099
}
11001100

11011101
@RequiresApi(Build.VERSION_CODES.M)

0 commit comments

Comments
 (0)