Engineering
Stretching audio by small amounts using Swift
Stretching an audio file to a certain length can be useful to fix lipsync issues. Our previous approach didn't work for stretching small durations over a large amount of time. We now have a new solution.
Tom Lokhorst
Handling audio capture gaps on macOS
Audio capture on macOS can sometimes contain gaps. This article explains how to detect and handle these gaps to maintain proper audio/video sync when recording to files.
Mathijs Kadijk
Sending the initial workout configuration through HealthKit
`HKWorkoutSession` will throw 'Remote session delegate is not set up' errors at you when sending data too soon. So how do we share data before starting the actual workout?
Request and check local network permission on iOS and visionOS
The local network permission has, in contrast to other permissions, no simple way to request the permission or check its autorization state. We use `NWBrowser` to roll our own permission helper.
Apps
Launching Bezel for Apple Vision Pro
Today we launch our app Bezel for Apple Vision Pro! 🚀 Bezel makes your iPhone appear as a 3D model in your space with the screen wirelessly mirrored.
Using Darwin Notifications to communicate with App Extensions
On iOS, Darwin Notifications can be used to send and receive notifications between an app and its extensions. We wrap the old C-style functions to be easier to use from Swift.
Transferable drag & drop with only a FileRepresentation not working on macOS
Supporting file dragging in macOS is a breeze with SwiftUI using the new Transferable protocol. However only having a FileRepresentation doesn't work for apps like Finder.
Incorrect output when writing a single AVTimedMetadataGroup
Timed metadata can be written to a track using AVAssetWriter. However if you append only one AVTimedMetadataGroup the results will be unexpected due to buggy behaviour.
Working with custom metadata in mp4 files
It is very useful, but also quite a pain to work with custom metadata in mp4 files with AVFoundation. Let's bridge the undocumented gaps and get it to work.
Stretching an audio file using Swift
Stretching an audio file to a certain length can be useful to fix lipsync issues. It isn't immediatly obvious how to do this using Swift. Here is a simple way to do it.
Launching Bezel
Today we launch our macOS app Bezel! 🚀 It helps you to show an iPhone on your Mac. Just plug it in the cable and it shows up, simple as that.
Talks
A Mac-tastic indie adventure
Mathijs gave a talk at CocoaHeadsNL about our journey as a company so far. What have we done in the last year, and what are our dreams for the future.
Display reconfigurations on macOS
Observing display reconfiguration changes on macOS. Moving from C function-pointer based API to a modern Swift AsyncStream.
Working with C callback functions in Swift using parameter packs
Moving from a C function-pointer based callback API to Swift closures with generics. And a look at the future with parameter packs.
AVAssetWriter leaking memory when segment data is used in Swift
Segment data delivered to AVAssetWriterDelegate is leaked when the delegate is implemented in Swift. You either need to implement the delegate in Objective-C or deallocate the data yourself. This issue is fixed by Apple in macOS 13.3.
A look at ScreenCaptureKit on macOS Sonoma
The new macOS introduces three new features: Presenter Overlay to add your webcam to a screen share, a new screenshot API, and a built-in picker UI to select a window or screen to share.
AVAssetWriter crash creating CMAF compliant segments
Using AVAssetWriter to create CMAF compliant segments in realtime is unstable on Intel macs when the frame rate is dynamic. You either need to switch away from CMAF, disable expectsMediaDataInRealTime or ensure a stable frame rate.
Mentioning SCStreamError crashes on older macOS versions
A public service annoucement for those using ScreenCaptureKit in an app that also needs to run on macOS < 12.3 (Monterey).
Recording to disk using ScreenCaptureKit
Saving a screen capture to disk has some interesting edge cases when using ScreenCaptureKit. The documentation and WWDC videos don't really cover using the captured frame samples. We created an example.
Using async/await in a commandline tool on older macOS versions
Building a commandline tool using Swift concurrency isn't as straight forward as you'd hope. Running on macOS pre-12 linker errors appear and back deployment is undocumented. We figured it out and documented it in this article.
Recording to disk using AVCaptureScreenInput
On older macOS versions, ScreenCaptureKit isn't available. We created an example project demonstrating screen recording using the older AVCaptureScreenInput.