jQrgen
08/05/2024, 9:38 AMFrançois
08/05/2024, 9:44 AMjQrgen
08/05/2024, 9:46 AMFrançois
08/05/2024, 9:47 AMFrançois
08/05/2024, 9:48 AMBundle
become NSBundle
in Obj-C/KotlinFrançois
08/05/2024, 9:50 AMval dialog =
UIAlertController.alertControllerWithTitle(title, message, UIAlertControllerStyleAlert)
val action =
UIAlertAction.actionWithTitle(
"OK",
UIAlertActionStyleDefault,
) { _ -> dialog.dismissViewControllerAnimated(true, null) }
dialog.addAction(action)
UIApplication.sharedApplication
.keyWindow
?.rootViewController
?.presentViewController(dialog, animated = true, completion = null)
François
08/05/2024, 9:52 AMjQrgen
08/05/2024, 9:57 AMjQrgen
08/05/2024, 9:57 AMFrançois
08/05/2024, 9:58 AMjQrgen
08/05/2024, 10:01 AMjQrgen
08/05/2024, 12:31 PMguard let url = Bundle.main.url(forResource: name, withExtension: "mp3") else {
print("Sound file not found")
return
}
François
08/05/2024, 12:33 PMNSBundle.mainBundle().pathForResource("name", "mp3")?.let {
println("my file")
} ?: run {
println("Sound file not found")
}
jQrgen
08/05/2024, 12:34 PMjQrgen
08/05/2024, 12:38 PMFrançois
08/05/2024, 12:39 PMjQrgen
08/05/2024, 12:39 PMerror = null
works…jQrgen
08/05/2024, 12:39 PMjQrgen
08/05/2024, 12:39 PMFrançois
08/05/2024, 12:40 PMFrançois
08/05/2024, 12:40 PMFrançois
08/05/2024, 12:41 PMFrançois
08/05/2024, 12:43 PMfun <T> throwError(block: (errorPointer: CPointer<ObjCObjectVar<NSError?>>) -> T): T {
memScoped {
val errorPointer: CPointer<ObjCObjectVar<NSError?>> = this.alloc<ObjCObjectVar<NSError?>>().ptr
val result: T = block(errorPointer)
val error: NSError? = errorPointer.pointed.value
if (error != null) {
throw Exception(
message = error.description,
cause = Exception("${error.code}|${error.domain}|${error.underlyingErrors}"),
)
} else {
return result
}
}
}
François
08/05/2024, 12:44 PMFrançois
08/05/2024, 12:45 PMjQrgen
08/05/2024, 12:47 PMjQrgen
08/05/2024, 12:50 PMFrançois
08/05/2024, 12:51 PMjQrgen
08/05/2024, 12:51 PMjQrgen
08/05/2024, 12:52 PMjQrgen
08/05/2024, 12:52 PMjQrgen
08/05/2024, 12:52 PMthrowError { errorPointer: CPointer<ObjCObjectVar<NSError?>> ->
val audioPlayer = AVAudioPlayer(contentsOfURL = url, error = errorPointer)
}
François
08/05/2024, 12:53 PMval audioPlayer = throwError { errorPointer: CPointer<ObjCObjectVar<NSError?>> ->
AVAudioPlayer(contentsOfURL = url, error = errorPointer)
}
jQrgen
08/05/2024, 12:53 PMFrançois
08/05/2024, 12:56 PMthrowError
will throw an error, so don't forget to try/catchjQrgen
08/05/2024, 1:05 PMjQrgen
08/05/2024, 1:05 PMjQrgen
08/05/2024, 1:06 PMFrançois
08/05/2024, 1:08 PMBundle/NSBundle
, they don't have the same names.jQrgen
08/05/2024, 1:18 PMjQrgen
08/05/2024, 1:19 PMFrançois
08/05/2024, 1:20 PMAVAudioPlayer
is quickly destroyed after using it, try to store it inside a singleton
for running your player code and see what happened.François
08/05/2024, 1:35 PMjQrgen
08/05/2024, 1:41 PMjQrgen
08/05/2024, 1:42 PMFrançois
08/05/2024, 1:42 PMjQrgen
08/05/2024, 1:43 PMFrançois
08/05/2024, 1:45 PMjQrgen
08/05/2024, 1:46 PMFrançois
08/05/2024, 1:47 PMjQrgen
08/05/2024, 1:47 PMjQrgen
08/05/2024, 2:06 PMjQrgen
08/05/2024, 2:10 PMjQrgen
08/05/2024, 2:16 PMFrançois
08/05/2024, 2:17 PMmarkturnip
08/06/2024, 8:43 AMmarkturnip
08/06/2024, 8:43 AMjQrgen
08/06/2024, 10:03 PM.mp3
file that the app has downloaded and save to filesystem using the okio library into an AVAudioPlayer
in an iosMain
target using kotlinjQrgen
08/07/2024, 1:06 AM.ogg
filejQrgen
08/07/2024, 1:06 AMFrançois
08/07/2024, 5:38 AMFrançois
08/07/2024, 6:56 AMinternal actual fun getDataStorePath(
platform: IPlatform,
fileName: String,
): Path {
val documentDirectory: NSURL? =
NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
return (requireNotNull(documentDirectory).path + "/$fileName").toPath()
}
Considering you saved your file inside the Document directory of your sandboxFrançois
08/07/2024, 6:57 AMjQrgen
08/07/2024, 6:58 AMFrançois
08/07/2024, 6:59 AMFrançois
08/07/2024, 7:05 AMjQrgen
08/07/2024, 7:06 AMjQrgen
08/07/2024, 11:30 AMPath
from getDataStorePath
in AVAudioPlayer
?François
08/07/2024, 11:35 AMFrançois
08/07/2024, 11:37 AMjQrgen
08/07/2024, 12:44 PMjQrgen
08/07/2024, 12:45 PMinternal actual fun getDataStorePath(
platform: IPlatform,
fileName: String,
): Path {
val documentDirectory: NSURL? =
NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
return (requireNotNull(documentDirectory).path + "/$fileName").toPath()
}
val fileURL = getFileURLInCacheDirectory(fileName)
audioPlayer = throwError { errorPointer: CPointer<ObjCObjectVar<NSError?>> ->
AVAudioPlayer(contentsOfURL = fileURL, error = errorPointer)
}
François
08/07/2024, 12:46 PMjQrgen
08/07/2024, 4:43 PMcontentsOfURL
?François
08/07/2024, 4:55 PMmarkturnip
08/08/2024, 8:50 AMAll third-party apps are “sandboxed”, so they are restricted from accessing files stored by other apps or from making changes to the device. Sandboxing is designed to prevent apps from gathering or modifying information stored by other apps. Each app has a unique home directory for its files, which is randomly assigned when the app is installed. If a third-party app needs to access information other than its own, it does so only by using services explicitly provided by iOS and iPadOS.
François
08/08/2024, 8:51 AMNSFileManager.defaultManager.URLForDirectory
or NSBundle.main.path...
markturnip
08/08/2024, 8:52 AMjQrgen
08/11/2024, 5:30 PMgetDataStorePath
I'm struggling to play the file directly from an url into AvAudioPLayerjQrgen
08/11/2024, 5:48 PMjQrgen
08/11/2024, 5:49 PMFrançois
08/12/2024, 6:06 AMjQrgen
08/12/2024, 7:36 AMmarkturnip
08/13/2024, 6:30 AMbookmark
then translating back into a url
during runtime