Commit graph

143 commits

Author SHA1 Message Date
Kyle Neideck
8ed95eb83b
Make sure Homebrew Travis CI builds won't show a password prompt.
`sudo` is usually passwordless in Travis CI builds, but for some reason
`sudo -v` still causes a password prompt in macOS Travis builds.

_uninstall-non-interactive.sh already included a workaround for this,
but it doesn't work when the Travis build for the Homebrew Cask calls
`brew uninstall background-music`, which then calls
_uninstall-non-interactive.sh. The old workaround used the `TRAVIS` env
var, but Homebrew seems to run the script in an environment without it.

See <https://github.com/Homebrew/homebrew-cask/pull/67524>.
2019-08-14 21:58:10 +10:00
Kyle Neideck
7f6c0e9d4f
Update the README to link to v0.3.1.
Also, bump the minor version number.
2019-08-13 18:46:25 +10:00
Kyle Neideck
9e50e2348b
Bump the patch version. I code signed v0.3.0 incorrectly. #233 2019-08-13 10:13:52 +10:00
Kyle Neideck
002afc0cd1
Update copyright years. #227 2019-08-05 22:42:17 +10:00
Kyle Neideck
0a7be7d32c
Enable Hardened Runtime in BGMApp, BGMXPCHelper and BGMDriver.
This is required for Notarization, which will be mandatory in macOS
Catalina.

Also, suppress some STL deprecation warnings in PublicUtility code. (The
warnings were recently added to Clang.)
2019-08-05 21:25:57 +10:00
Kyle Neideck
94fc1259e3
Add BGMMusic files to the Xcode project.
Also, add BGMMusic to BGMMusicPlayers and add the Scripting Bridge
header for Music.app.

Resolves #216.
2019-07-03 02:34:15 +10:00
Leo Nesfield
3ac7221cb1
Create BGMMusic.h 2019-06-30 17:16:16 +01:00
Leo Nesfield
2be4bab54f
Create BGMMusic.m 2019-06-30 17:14:35 +01:00
Kyle Neideck
04f17301a1
Fix BGMApp test compilation.
Updates the lists of files to be compiled when the tests are built,
which were missing the new source files added in the previous commit.
2019-06-09 19:43:17 +10:00
Kyle Neideck
e616718eab
Add music player: Google Play Music Desktop Player.
The code for GPMDP is a lot more complicated than the code for other
music players. See BGMGooglePlayMusicDesktopPlayer.h for details.

Adds a class, BGMAppWatcher, to hold the code that notifies listeners
when a given app is launched or terminated.

Resolves #161.
2019-06-09 18:56:12 +10:00
Kyle Neideck
503d1a92ec
Fix another crash when BGMDevice's volume is changed.
Fixes the same issue as df9815a4be, but in
BGMOutputVolumeMenuItem instead of BGMStatusBarItem.

I think the problem was that it captured a weak reference in a C++
lambda, but it would capture by (C++) reference and when the reference
was used it would be referencing invalid memory. The fix to have the
lambda capture by value instead.

See #202.
2019-03-28 18:29:54 +11:00
Kyle Neideck
a40dfde439
Fix potential minor memory leaks in BGMPreferredOutputDevices. 2019-03-27 13:36:19 +11:00
Kyle Neideck
df9815a4be
Fix a crash when BGMDevice's volume is changed.
I think that, because BGMStatusBarItem::initWithMenu was capturing a
weak reference in a C++ lambda as a C++ reference, the C++ reference
would be invalid when it was used. The fix to have the lambda capture by
value instead.

I'm not completely sure why builds from Xcode never crashed or why ASan
didn't catch the bug. Maybe the stack memory was just never
reused/invalidated with Xcode builds. (And I probably just don't
understand how ASan works well enough.)

Fixes #202.
2019-03-27 12:55:12 +11:00
Kyle Neideck
e093e7d3b2
Add an option to use a volume icon instead of the Background Music logo.
This is so the icon can show the current volume. Then you can hide the
built-in volume status bar item in System Preferences.

Closes #183.
2019-03-05 00:01:42 +11:00
Kyle Neideck
a4c93c050b
Fix build_and_install.sh failing when run from a path containing spaces.
When build_and_install.sh tried to install BGMXPCHelper, xcodebuild
would fail to run post_install.sh.

Fixes #187.
2019-01-22 21:58:47 +11:00
Kyle Neideck
475d141ae4
Make builds more deterministic.
Packages built with package.sh should now be byte-identical except for
timestamps in Assets.car (in BGMApp resources) and modification dates in
the package's Bom file, if built with the same version of Xcode.
Hopefully this will be enough to allow builds to be reproduced, with a
bit of effort.
2018-11-12 19:15:26 +11:00
Kyle Neideck
d1f5492a47
Fix compilation errors with Clang 8 in BGMAppUITests.
You can't run the UI tests in Xcode 8 anyway, so now we just skip
compiling them.
2018-11-04 18:15:52 +11:00
Kyle Neideck
64b7ca9fd9
Fix compilation error with Clang 8 in BGMOutputDeviceMenuSection. 2018-11-04 17:57:42 +11:00
Kyle Neideck
7b8d1a0e0d
Rename BGMOutputDevicePrefs to BGMOutputDeviceMenuSection. 2018-11-04 15:28:01 +11:00
Kyle Neideck
5e12f9fc01
Move the output device menu items to the main menu.
I don't know why I put them in the Preferences menu initially. This is
more convenient.

Closes #170.

Also:
 - Update the output device menu items as needed instead of when the
   user opens the menu. This saves a bit of CPU time and means if the
   user has the menu open, changes are made when they're needed instead
   of the next time the user opens the menu.
 - Fix BGMAppUITests::testCycleOutputDevices for the latest Xcode/macOS.
2018-11-04 12:30:43 +11:00
Kyle Neideck
94f13e747c
Clarify some comments in BGMPreferredOutputDevices. 2018-10-28 18:11:40 +11:00
Kyle Neideck
4c0c656538
Store the preferred devices list in User Defaults.
BGMApp has to set BGMDevice, and often also the Null Device for a short
time, as the systemwide default audio device, which makes CoreAudio put
them in the preferred devices list in its Plist file. And since the list
is limited to three devices, it only gives us one or two usable ones.
Ideally, CoreAudio just wouldn't add our devices to its list, but I
don't think we can prevent that.

As a partial workaround, we now store our own copy of the preferred
devices list without our devices, which BGMApp can use to figure out
which devices were pushed out of CoreAudio's list by our devices.

This doesn't fix the problem entirely because our devices still take up
room in CoreAudio's list when BGMApp is closed, but I think that would
be harder to solve.

See #167.

Also:
 - Handle setting the initial output device in BGMPreferredOutputDevices
   instead of BGMAudioDeviceManager.
 - Fix a crash in BGMOutputVolumeMenuItem::dealloc caused by using
   dispatch_sync to dispatch to the main queue while running on the main
   queue.
 - Fix a crash in BGMPreferredOutputDevices if
   /Library/Preferences/Audio/com.apple.audio.SystemSettings.plist
   doesn't exist.
 - Add Swinsian to the list of music players in the README. (I must have
   forgotten to do that when I added support for it.)
2018-10-28 17:08:47 +11:00
Kyle Neideck
871bb97a52
Increment minor version number. 2018-10-25 00:00:52 +11:00
Kyle Neideck
ffe7406025
Fix errors logged when the current output device is disconnected. 2018-10-24 23:46:28 +11:00
Kyle Neideck
29642da1cf
Update the preferred devices list when the user changes output device.
When the user chooses a different output device in BGMApp, the new
device is now added to the front of the list of preferred devices. This
stops BGMPreferredOutputDevices changing the output device back shortly
afterward when it gets a device connection/disconnection notification,
which is sent because BGMDriver's Null Device is enabled and then
disabled as part of changing the output device.

It also means BGMApp will now account for the times the output device
has been changed since BGMApp started when deciding whether to change to
a newly connected device and deciding which device to change to when the
current output device is removed.
2018-10-24 22:29:20 +11:00
Kyle Neideck
1bb3873a53
Change output device in some cases when devices are added/removed.
Tries to copy the way CoreAudio normally handles devices being added or
removed, which it can't do while Background Music is running (because
BGMDevice needs to be the default output device for the system).

This may break when Background Music is run on later versions of macOS
as the only way BGMApp can tell what CoreAudio (probably) would have
done is by reading one of its Plist files directly.

See #167.
2018-10-23 14:07:13 +11:00
Kyle Neideck
b0282706df
Fix adding "SNAPSHOT"/"DEBUG" to the version string with multiple tags.
The most recent tag is now used to decide whether to add "-SNAPSHOT-..."
to the version string. So now we can make a new release by tagging a
commit even if we've already made a snapshot/debug release from the same
commit.
2018-10-16 12:38:52 +11:00
Kyle Neideck
94a5f37c2b
Fix BGMOutputVolumeMenuItem tooltip not always being updated.
When you changed to an output device with no data sources, the tooltip
was left set to the name of the previous output device.
2018-10-06 21:42:33 +10:00
Kyle Neideck
797d2f14f5
Update the output device name in the UI if its data source changes.
For the label above the output device volume slider, we use the name of
the output device's current data source, if it has one. But it was only
being updated when the user changed to a different output device.
BGMOutputVolumeMenuItem now updates the label if the output device
changes to a different data source, e.g. from Internal Speakers to
Headphones.
2018-10-06 21:17:41 +10:00
Kyle Neideck
9b33fffd23
Fix the Show More Controls buttons displaying as "...".
The character we use for them (looks like '^') seems to be 1 pixel wider
on macOS 10.14, which meant it didn't fit in the text label anymore.
2018-10-06 12:46:07 +10:00
Kyle Neideck
1a49802675
Hide call to requestAccessForMediaType when compiling on macOS < 10.14.
This should fix the compilation error in BGMAppDelegate when compiling
against a macOS SDK earlier than 10.14.
2018-10-03 18:40:22 +10:00
Kyle Neideck
75e8d5ceac
Request user permission to use input devices and Apple Events.
This is required to build against the macOS 10.14 SDK because 10.14
requires users to grant apps permission before they can use audio input
devices or send Apple Events to other apps.

I think builds built against the 10.13 SDK were supposed to continue
working, but I haven't tested it.

Note that without NSMicrophoneUsageDescription and
NSAppleEventsUsageDescription, 10.14 builds will fail more or less
silently when they try to use those features. (tccd does log a message
about it, though.)

See #163.
2018-10-03 13:28:18 +10:00
Kyle Neideck
1e5d625d64
Add app volume workaround for Skype. Fixes #112. 2018-07-03 09:49:16 +10:00
Kyle Neideck
ffa86bbcd9
Add workaround for Discord voice chat volume. 2018-06-19 22:39:40 +10:00
Kyle Neideck
2a41204fc0
Update the years in some copyright notices. 2018-06-05 01:13:14 +10:00
Kyle Neideck
cb9cdb00b6
Support creating .pkg installers using the debug build configuration.
Users reporting bugs will be able to use these packages to install debug
builds of Background Music without having to install from source. This
is mainly useful because debug builds have more detailed logging.
Hopefully we'll get around to adding an option to enable debug logging
at runtime, but this should work well enough for now.

Also:
 - Use newer macOS images in Travis CI builds.
 - Fix an xcrun command in build_and_install.sh that was accidentally
   being started in the background.
 - Fix build_and_install.sh building libPublicUtility.a twice for no
   reason.
2018-06-05 00:40:21 +10:00
Kyle Neideck
ed06a257a8
Add auto-pause support for Swinsian. See #141. 2018-02-25 12:01:43 +11:00
Kyle Neideck
3ba53a50ac
Support building snapshot releases by creating tags.
If HEAD is tagged, check for "SNAPSHOT" or "DEBUG" in the tag name when
generating the version string for a build. If found, add
"-SNAPSHOT-abcdef0" or "-DEBUG-abcdef0" at the end of the version
string (where "abcdef0" is the short commit ID for HEAD).
2018-02-24 17:55:29 +11:00
Kyle Neideck
944fc11212
Add workaround for FaceTime volume.
FaceTime plays call audio using a daemon called avconferenced, so
BGMDriver can't tell where the audio is actually coming from. As a
hopefully temporary fix, BGMApp now just sets avconferenced's volume to
match FaceTime's. See #139.

Also,
 - set a tooltip and accessibility label for BGMApp's status bar item
   (the thing you click to show the main menu), and
 - some minor refactoring.
2018-02-24 15:23:18 +11:00
Kyle Neideck
287bae0923
Fix mocks in BGMMusicPlayersUnitTests. 2018-01-21 13:43:30 +11:00
Kyle Neideck
6117bc285c
Fix BGMApp crashing at launch if BGMDriver isn't installed. 2018-01-20 22:28:32 +11:00
Kyle Neideck
18aa97f055
Fix some minor bugs, mostly found by Coverity.
BGMDeviceControlsList: Set some members to null before they've been
lazily initialised.

BGM_TaskQueue: Fix the destructor possibly throwing.

BGM_Device and BGM_NullDevice: Fix integer division when calculating the
host clock frequency.

BGM_Utils: Fix the C++ utility function used to explicitly cast
__nullable values to __nonnull. (Was previously unused.)
2017-12-28 18:46:52 +11:00
Kyle Neideck
f64cf41f8a
Add a volume slider for system sounds.
System sounds are UI-related sounds like mail notifications or terminal
bells.

Xcode 9.2 doesn't support saving .xib files in Xcode 7 format any more,
so building Background Music now requires Xcode 8 or above.

Also, fix some of the tooltips that would only work if BGMApp was the
foreground app, which it shouldn't be.
2017-12-26 23:10:57 +11:00
Kyle Neideck
425cb4af9d
When the output device is changed, update its volume slider.
The label above the slider is set to the name of the new output device
and the slider's value is set to its volume.

Also,
 - clean up some code in BGMAudioDeviceManager and
   BGMOutputVolumeMenuItem, and
 - return from BGMAppDelegate::applicationDidFinishLaunching early if
   the launch is being aborted.
2017-11-26 16:12:56 +11:00
Kyle Neideck
4c6de2f77f
Add new QuickLook bundle ID to fix App Volumes for Finder.
QuickLook's bundle ID has changed in High Sierra, which broke the
workaround that BGMApp uses to change QuickLook's app volume when
Finder's is changed.

Reported in #134.
2017-11-25 13:28:43 +11:00
Kyle Neideck
ec81520379
Fix BGMApp unit tests not compiling. 2017-10-29 01:00:37 +11:00
Kyle Neideck
1171bee102
Refactor non-UI code out of BGMAppVolumes. 2017-10-28 18:13:08 +11:00
Kyle Neideck
fb0740c4c1
Enable new compiler warnings suggested by Xcode. 2017-10-23 21:40:30 +11:00
Kyle Neideck
db63ae0cf1
Add BGMTermination files forgotten in previous commit. 2017-10-23 21:35:49 +11:00
Kyle Neideck
59e70fb9d1
Set the OS default audio device back if BGMApp exits abnormally.
This is mostly so BGMApp won't leave BGMDevice as the default if BGMApp
crashes, which would stop audio from playing until the user changed the
default device themselves. Also handles SIGINT, SIGTERM and SIGQUIT.

For crashes where the BGMApp process may be in an unknown state, e.g.
segfaults, BGMXPCHelper handles changing the default device.

Should fix the Travis Xcode 9 build, which is currently failing because
the AppleScript we use to quit BGMApp in .travis.yml gets "user
cancelled" for some reason.

Also makes some minor improvements to the reports generated by
CrashReporter. The way CrashReporter works with Background Music should
otherwise be unchanged.
2017-10-23 20:19:42 +11:00