Compare commits

...

19 Commits

Author SHA1 Message Date
Kyle Neideck 3d4e1bff10 Merge pull request #785 from khipp/update-homebrew
Update Homebrew installation instructions
2024-12-23 00:11:29 +11:00
Klaus Hipp 1c743053c6 Update Homebrew installation instructions 2024-12-22 14:04:59 +01:00
Kyle Neideck de1a9fa413 Merge pull request #781 from johzzy/master
feat: BGMAppDelegate.h forward declaring @class BGMAudioDeviceManager and @class BGMAppVolumesController
2024-12-19 20:56:34 +11:00
Johnny 12a7deb15f feat: BGMAppDelegate.h forward declaring @class BGMAudioDeviceManager and @class BGMAppVolumesController 2024-12-18 18:18:20 +08:00
Kyle Neideck e6375b0919 Merge pull request #779 from johzzy/master
update c++11 lambda for CAPropertyAddressList
2024-12-08 20:10:46 +11:00
Johnny 029cb2f5f8 remove part of #pragma clang diagnostic ignored "-Wdeprecated". 2024-12-08 15:20:40 +08:00
Johnny 2ac8a1afd1 update c++11 lambda for CAPropertyAddressList 2024-12-07 09:45:23 +08:00
Kyle Neideck 784bb249a9 Merge pull request #778 from johzzy/master
fix crash
2024-12-07 09:47:09 +11:00
Johnny 51e1266532 fix crash 2024-12-06 18:30:51 +08:00
Kyle Neideck 4b7caeeb54 Merge pull request #777 from johzzy/master
fix crash in BGMPlayThrough::IsRunningSomewhereOtherThanBGMApp
2024-12-06 21:07:47 +11:00
Johnny 7e592ebb2b fix crash in BGMPlayThrough::IsRunningSomewhereOtherThanBGMApp 2024-12-06 11:32:25 +08:00
Kyle Neideck 0aea54f0c5 Merge pull request #776 from johzzy/master
format log about "BGMDevice is not running somewhere other than BGMApp"
2024-12-06 14:30:31 +11:00
Johnny 9407ee36d2 update format log about "BGMDevice is not running somewhere other than BGMApp" 2024-12-06 10:43:40 +08:00
Kyle Neideck 9058e3c556 Merge pull request #767 from 7Backwards/Fix-volume-icon-on-menu-bar-not-centered
Fix volume icon on menu bar not centered
2024-09-09 19:57:41 +10:00
Gonçalo Neves a8f4ace099 Fix volume icon on menu bar not centered 2024-09-07 21:39:42 +00:00
Kyle Neideck 610f15c556 Merge pull request #741 from manzick/arc-support
Add arc browser support
2024-05-27 01:05:31 +10:00
manzick 62174be95e Add arc browser support 2024-05-26 20:48:17 +06:00
Kyle Neideck 48bdcd1a64 Allow installation when Rosetta 2 isn't installed.
If you didn't have Rosetta 2 installed, the Background Music installer
would tell you that it's required and prompt you to install it.
Background Music doesn't actually need Rosetta 2; macOS just assumes
that it does unless told otherwise.
2024-05-13 13:36:51 +10:00
Kyle Neideck cb6f38821e README.md: Make v0.4.3 the current version. 2024-04-26 15:49:28 +10:00
10 changed files with 41 additions and 63 deletions
+3 -4
View File
@@ -22,7 +22,7 @@ assignees: ''
**Versions**
> Please complete the following information.
- Background Music: [e.g. "0.4.0" or "0.4.0-SNAPSHOT-c0ab98b". `Preferences > About Background Music`]
- Background Music: [e.g. "0.4.3" or "0.4.0-SNAPSHOT-c0ab98b". `Preferences > About Background Music`]
- macOS: [e.g. "11.3 Beta (20E5172i)" or "Big Sur". ` > About This Mac`]
**Hardware**
@@ -43,8 +43,7 @@ assignees: ''
> Tips
> (Delete this section before posting.)
> - https://github.com/kyleneideck/BackgroundMusic#troubleshooting
> - Try the latest SNAPSHOT version from https://github.com/kyleneideck/BackgroundMusic/releases
> - Especially if you're using macOS Big Sur.
> - If your bug is one of common issues, consider leaving a comment or a +1 (👍) on an existing issue:
> - Try the latest SNAPSHOT version from https://github.com/kyleneideck/BackgroundMusic/releases (if it's newer than the latest non-SNAPSHOT release).
> - If your bug is one of these common issues, consider leaving a comment or a +1 (👍) on an existing issue:
> - Background Music currently only supports audio devices with two channels. Bluetooth devices often only have one.
> - Volumes having no effect for certain apps: Microsoft Teams ([workaround](https://github.com/kyleneideck/BackgroundMusic/issues/268#issuecomment-604977210)), Zoom ([workaround](https://github.com/kyleneideck/BackgroundMusic/issues/396#issuecomment-741992157)), Discord ([workaround](https://github.com/kyleneideck/BackgroundMusic/issues/210#issuecomment-507048957), [see also](https://github.com/kyleneideck/BackgroundMusic/issues/267#issuecomment-617327850)), Chrome (sometimes)
+2 -4
View File
@@ -23,13 +23,11 @@
// Sets up and tears down the app.
//
// Local Includes
#import "BGMAudioDeviceManager.h"
#import "BGMAppVolumesController.h"
// System Includes
#import <Cocoa/Cocoa.h>
@class BGMAudioDeviceManager;
@class BGMAppVolumesController;
// Tags for UI elements in MainMenu.xib
static NSInteger const kVolumesHeadingMenuItemTag = 3;
+5
View File
@@ -57,6 +57,8 @@ BGMAudioDevice::~BGMAudioDevice()
bool BGMAudioDevice::CanBeOutputDeviceInBGMApp() const
{
CFStringRef uid = CopyDeviceUID();
assert(uid != nullptr);
bool isNullDevice = CFEqual(uid, CFSTR(kBGMNullDeviceUID));
CFRelease(uid);
@@ -340,6 +342,9 @@ bool BGMAudioDevice::IsBGMDevice(bool inIncludeUISoundsInstance) const
{
// Check the device's UID to see whether it's BGMDevice.
CFStringRef uid = CopyDeviceUID();
if (uid == nullptr) {
return isBGMDevice;
}
isBGMDevice =
CFEqual(uid, CFSTR(kBGMDeviceUID)) ||
+3 -1
View File
@@ -243,7 +243,9 @@ BGMBackgroundMusicDevice::ResponsibleBundleIDsOf(CACFString inParentBundleID)
// Google Chrome
{ "com.google.Chrome", { "com.google.Chrome.helper" } },
// Microsoft Edge
{ "com.microsoft.edgemac", { "com.microsoft.edgemac.helper" } }
{ "com.microsoft.edgemac", { "com.microsoft.edgemac.helper" } },
// Arc
{ "company.thebrowser.Browser", { "company.thebrowser.browser.helper" } }
};
// Parallels' VM "dock helper" apps have bundle IDs like
+3 -4
View File
@@ -894,7 +894,7 @@ void BGMPlayThrough::HandleBGMDeviceIsRunning(BGMPlayThrough* refCon)
DebugMsg("BGMPlayThrough::HandleBGMDeviceIsRunning: "
"BGMDevice is %srunning somewhere other than BGMApp",
isRunningSomewhereOtherThanBGMApp ? "" : " not");
isRunningSomewhereOtherThanBGMApp ? "" : "not ");
if(isRunningSomewhereOtherThanBGMApp)
{
@@ -933,9 +933,8 @@ void BGMPlayThrough::HandleBGMDeviceIsRunningSomewhereOtherThanBGMApp(BGMPlay
// static
bool BGMPlayThrough::IsRunningSomewhereOtherThanBGMApp(const BGMAudioDevice& inBGMDevice)
{
return CFBooleanGetValue(
static_cast<CFBooleanRef>(
inBGMDevice.GetPropertyData_CFType(kBGMRunningSomewhereOtherThanBGMAppAddress)));
auto type = inBGMDevice.GetPropertyData_CFType(kBGMRunningSomewhereOtherThanBGMAppAddress);
return type && CFBooleanGetValue(static_cast<CFBooleanRef>(type));
}
#pragma mark IOProcs
+11 -4
View File
@@ -125,10 +125,17 @@ static CGFloat const kVolumeIconAdditionalVerticalPadding = 0.075;
- (void) initIcons {
// Load the icons.
fermataIcon = [NSImage imageNamed:@"FermataIcon"];
volumeIcon0SoundWaves = [NSImage imageNamed:@"Volume0"];
volumeIcon1SoundWave = [NSImage imageNamed:@"Volume1"];
volumeIcon2SoundWaves = [NSImage imageNamed:@"Volume2"];
volumeIcon3SoundWaves = [NSImage imageNamed:@"Volume3"];
if (@available(macOS 11.0, *)) {
volumeIcon0SoundWaves = [NSImage imageWithSystemSymbolName:@"speaker.fill" accessibilityDescription:nil];
volumeIcon1SoundWave = [NSImage imageWithSystemSymbolName:@"speaker.wave.1.fill" accessibilityDescription:nil];
volumeIcon2SoundWaves = [NSImage imageWithSystemSymbolName:@"speaker.wave.2.fill" accessibilityDescription:nil];
volumeIcon3SoundWaves = [NSImage imageWithSystemSymbolName:@"speaker.wave.3.fill" accessibilityDescription:nil];
} else {
volumeIcon0SoundWaves = [NSImage imageNamed:@"Volume0"];
volumeIcon1SoundWave = [NSImage imageNamed:@"Volume1"];
volumeIcon2SoundWaves = [NSImage imageNamed:@"Volume2"];
volumeIcon3SoundWaves = [NSImage imageNamed:@"Volume3"];
}
// Set the icons' sizes.
NSRect statusBarItemFrame;
@@ -23,6 +23,10 @@
#import "BGMAppDelegate.h"
// Local Includes
#import "BGMAudioDeviceManager.h"
#import "BGMAppVolumesController.h"
// Local Includes
#import "BGMASOutputDevice.h"
#import "BGMASApplication.h"
+3 -32
View File
@@ -98,32 +98,6 @@ public:
static bool IsCongruentElement(AudioObjectPropertyElement inElement1, AudioObjectPropertyElement inElement2) { return (inElement1 == inElement2) || (inElement1 == kAudioObjectPropertyElementWildcard) || (inElement2 == kAudioObjectPropertyElementWildcard); }
static bool IsCongruentAddress(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) { return IsCongruentScope(inAddress1.mScope, inAddress2.mScope) && IsCongruentSelector(inAddress1.mSelector, inAddress2.mSelector) && IsCongruentElement(inAddress1.mElement, inAddress2.mElement); }
static bool IsCongruentLessThanAddress(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) { bool theAnswer = false; if(!IsCongruentScope(inAddress1.mScope, inAddress2.mScope)) { theAnswer = inAddress1.mScope < inAddress2.mScope; } else if(!IsCongruentSelector(inAddress1.mSelector, inAddress2.mSelector)) { theAnswer = inAddress1.mSelector < inAddress2.mSelector; } else if(!IsCongruentElement(inAddress1.mElement, inAddress2.mElement)) { theAnswer = inAddress1.mElement < inAddress2.mElement; } return theAnswer; }
// STL Helpers
public:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
struct EqualTo : public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
{
bool operator()(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) const { return IsSameAddress(inAddress1, inAddress2); }
};
struct LessThan : public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
{
bool operator()(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) const { return IsLessThanAddress(inAddress1, inAddress2); }
};
struct CongruentEqualTo : public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
{
bool operator()(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) const { return IsCongruentAddress(inAddress1, inAddress2); }
};
struct CongruentLessThan : public std::binary_function<AudioObjectPropertyAddress, AudioObjectPropertyAddress, bool>
{
bool operator()(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2) const { return IsCongruentLessThanAddress(inAddress1, inAddress2); }
};
#pragma clang diagnostic pop
};
//==================================================================================================
@@ -160,11 +134,8 @@ public:
const AudioObjectPropertyAddress* GetItems() const { return &(*mAddressList.begin()); }
AudioObjectPropertyAddress* GetItems() { return &(*mAddressList.begin()); }
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
bool HasItem(const AudioObjectPropertyAddress& inAddress) const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::CongruentEqualTo(), inAddress)); return theIterator != mAddressList.end(); }
bool HasExactItem(const AudioObjectPropertyAddress& inAddress) const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::EqualTo(), inAddress)); return theIterator != mAddressList.end(); }
#pragma clang diagnostic pop
bool HasItem(const AudioObjectPropertyAddress& inAddress) const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), [&inAddress](const CAPropertyAddress& addr) { return CAPropertyAddress::IsCongruentAddress(addr, inAddress); }); return theIterator != mAddressList.end(); }
bool HasExactItem(const AudioObjectPropertyAddress& inAddress) const { AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), [&inAddress](const CAPropertyAddress& addr) { return CAPropertyAddress::IsSameAddress(addr, inAddress); }); return theIterator != mAddressList.end(); }
void AppendItem(const AudioObjectPropertyAddress& inAddress) { mAddressList.push_back(inAddress); }
void AppendUniqueItem(const AudioObjectPropertyAddress& inAddress) { if(!HasItem(inAddress)) { mAddressList.push_back(inAddress); } }
@@ -172,7 +143,7 @@ public:
void InsertItemAtIndex(UInt32 inIndex, const AudioObjectPropertyAddress& inAddress) { if(inIndex < mAddressList.size()) { AddressList::iterator theIterator = mAddressList.begin(); std::advance(theIterator, static_cast<int>(inIndex)); mAddressList.insert(theIterator, inAddress); } else { mAddressList.push_back(inAddress); } }
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
void EraseExactItem(const AudioObjectPropertyAddress& inAddress) { AddressList::iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::EqualTo(), inAddress)); if(theIterator != mAddressList.end()) { mAddressList.erase(theIterator); } }
void EraseExactItem(const AudioObjectPropertyAddress& inAddress) { AddressList::iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), [&inAddress](const CAPropertyAddress& addr) { return CAPropertyAddress::IsSameAddress(addr, inAddress); }); if(theIterator != mAddressList.end()) { mAddressList.erase(theIterator); } }
#pragma clang diagnostic pop
void EraseItemAtIndex(UInt32 inIndex) { if(inIndex < mAddressList.size()) { AddressList::iterator theIterator = mAddressList.begin(); std::advance(theIterator, static_cast<int>(inIndex)); mAddressList.erase(theIterator); } }
void EraseAllItems() { mAddressList.clear(); }
+6 -13
View File
@@ -68,16 +68,16 @@ You can download the current version of **Background Music** using the following
### Option 1
Download **version 0.4.0**:
Download **version 0.4.3**:
<a href="https://github.com/kyleneideck/BackgroundMusic/releases/download/v0.4.0/BackgroundMusic-0.4.0.pkg"><img
<a href="https://github.com/kyleneideck/BackgroundMusic/releases/download/v0.4.3/BackgroundMusic-0.4.3.pkg"><img
src="Images/README/pkg-icon.png" width="32" height="32" align="absmiddle" />
BackgroundMusic-0.4.0.pkg</a> (895 KB)
BackgroundMusic-0.4.3.pkg</a> (771 KB)
> <sub>MD5: 0fc3c839939b1b55b799f3e00755d949</sub><br/>
> <sub>SHA256: f170957702c48f96c0fa9706b72f6d6048bcc87be393eb1d01289c20e1111325</sub><br/>
> <sub>MD5: 8c3bfe26c9cdf27365b9843f719ef188</sub><br/>
> <sub>SHA256: c1c48a37c83af44ce50bee68879856c96b2f6c97360ce461b1c7d653515be7fd</sub><br/>
> <sub>PGP:
> [sig](https://github.com/kyleneideck/BackgroundMusic/releases/download/v0.4.0/BackgroundMusic-0.4.0.pkg.asc),
> [sig](https://github.com/kyleneideck/BackgroundMusic/releases/download/v0.4.3/BackgroundMusic-0.4.3.pkg.asc),
> [key (0595DF814E41A6F69334C5E2CAA8D9B8E39EC18C)](https://bearisdriving.com/kyle-neideck.gpg)</sub>
### Option 2
@@ -88,13 +88,6 @@ Install using [Homebrew](https://brew.sh/) by running the following command in *
brew install --cask background-music
```
If you want the latest snapshot version, run:
```bash
brew tap homebrew/cask-versions
brew install --cask background-music-pre
```
# Run / Configure
Just run `Applications > Background Music.app`! **Background Music** sets itself as your default output device under
+1 -1
View File
@@ -17,7 +17,7 @@
<pkg-ref id="com.bearisdriving.BGM"/>
<options customize="never" require-scripts="false" />
<options customize="never" require-scripts="false" hostArchitectures="arm64,x86_64" />
<choices-outline>
<line choice="default">