This release primarily focusses on stability and performance improvements. I learned a little bit about iOS thread management (related to DispatchQueues), and realized that my various uses of DispatchSemaphore were likely the cause of what I’ve come to call “queue clogging” where stuff just … stops working.
Associated with v3.14.1 (near the end of May), I made a change to the free tier, increasing it from 1 camera to 3 cameras, and from 1 device to 2 devices. And then I promptly forgot about the change. Fast forward a few months and I’ve been mesmerized by how stagnant app use and “blah” user retention has transformed into steady month-over-month growth and dramatically improved user retention. And then I remembered…. So, with v3.16.1, I’ve increased (possibly temporarily; we’ll see) the free tier from 3 cameras to 9 cameras. There’ll be diminishing returns on a change like this, for sure, but I’m hoping it attracts the right “level” of user who will ultimately find value in the paid upgrade features.
- Updates the Recording File Snapshots screen so that by default each section (representing a ten minute file) shows one snapshot. Each section can be individually expanded or collapsed. The Options menu at the top allows for expand-all and collapse-all. You can now also delete a file without first viewing it on the Details screen.
- Fixes a Recording Date selection issue (on iOS) where despite tapping on one date, another date might animate and be selected. This fix happens a class responsible for all of the tap animations throughout the app, so this should hopefully fix this same experience in other parts of the app.
- Fixes a Recording playback issue where playback would stop when the recording file read process stopped, without regards for the buffer of data waiting to be played.
- Improves NAS / S3 recording playback with read-ahead async functionality, which was _very_ needed.
- Fixes an audio conversion issue that would spam the console (when running a YouTube live stream from a G.711mu audio source) with messages regarding the app claiming to have a 1-packet 512-byte blob, when in fact it was a 512-byte, 512-packet blob. This may have also fixed the audio converter crash.
- Removes our custom menu view (CMTMenuView) from CMTStreamerViewController. The custom menu view was great because the tvOS 16 (and earlier) alert dialog was very graphics intensive. This tvOS 17 alert dialog seems to be more light-weight. I'll have to test this when streaming a bunch of cameras to make sure it doesn't similarly create instability.
- Finally fixes the errant "device offline alert" issue. I was removing the queued alert but not disabling the associated timer. Ugh.
- Fixes some new Penguin-related Xcode 15 build issues related to the use of "some". This also means that I can no longer build the API server without Sonoma + Xcode 15, so that's something.
- Improves the tvOS PTZ interface by getting rid of the ugly, dark, opaque triangles and replacing them with something more aesthetically pleasing. Also, possibly fixes an issue where the tap-handler sometimes wouldn't toggle between PT-mode and Z-mode. Maybe.
- Adds some missing indexes to the API server's database; it's kind of crazy I overlooked this for so long.
- Improves remote streaming reliability specifically when it comes to reconnecting after a stream failure.
- Improves database cleanup of old, expired records.
- As a test, I'm increasing the free tier from 3 cameras to 9 cameras. Going from 1 to 3 had a significant impact on app use and user retention. I'm leaving the other limits as-is, which should help distinguish between the free home user vs the paid business user.
- Fixes an issue when writing changes to a Camera, Smart Device, FileServer, Group or Module, where the write may have been incorrectly (and silently) disregarded due to an improper version check. This fix specifically deals with a Hubitat issue where one's smart device actions could eventually be overwritten.
- Fixes various layout issues in the Stream cell when editing an ONVIF camera (iPhone-only). It's still not quite perfect, but at least all of the stream details aren't completely occluded by the preview image.
- Fixes an API server reconnection issue where connectivity issues to the API server would cause many concurrent reconnection attempts.
- Fixes a crash related to the ONVIF camera edit screen.
- Deletes a bunch of old, unused code.
- Reverts some earlier changes where I migrated away from the use of the Global dispatch queue, in favor of private, concurrent queues, only to later learn that the use of private concurrent queues can negatively impact the thread count.
- Fixes a crash associated with streaming a local, attached camera where if the connect() process failed, we'd call stop() which would call stopRunning() on the capture session, which would happen between beginConfiguration() and commitConfiguration() which is apparently illegal.
- Fixes a crash due to accessing some data structures that should have been wrapped in a queue.
- Improves the HomeScreen so that by default it doesn't load much (just permissions info), but a pull-to-refresh will pull down all account data relevant to that device (effectively a "refresh everything").
- Fixes an issue where Permissions changes were not automatically refreshed on affected devices. [DV]
- Copies the support hours text from the Help ==> Support screen to the main Help screen, for improved visibility.
- Fixes a long standing issue on the API server (and maybe occasionally within the app) where we maxed out the number of threads available. I've replaced most uses of wait() and sleep() with async equivalents where appropriate. In the app there are some file handle classes with functions that are supposed to block on IO, and those continue to use wait() as that's unavoidable.
- Fixes a Penguin memory leak where the connect headers were cached pending the switch to a web socket, but the cached headers were never removed.
- Adds some website analytics via StatCounter
Streamie provides a best-in-class user experience on your iPhone, iPad, Apple TV and Apple Silicon Mac, with an intuitive user interface that makes it simple to discover, stream, record, monitor and share your HomeKit, Google Nest, Ubiquiti UniFi Protect and ONVIF-compatible IP and RTSP cameras. Streamie keeps you informed with motion event notifications and it works with most cameras using its advanced audio and video codec support. You can watch your cameras from anywhere, record 24/7 to your private NAS, remotely manage multiple locations, device permissions and seamlessly synchronize settings across your devices; configure Hubitat smart home automations, live stream to YouTube and rely on the in-app technical support system when you need help (but you can also reach us by phone). Download Streamie today. Lastly, Streamie is solar powered!