Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ permissions:
jobs:
build:
name: Build & Verify Universal Binary
runs-on: macos-14
runs-on: macos-15

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Select Xcode
run: |
XCODE_PATH=$(ls -d /Applications/Xcode_16*.app 2>/dev/null | sort -V | tail -1)
XCODE_PATH=$(ls -d /Applications/Xcode_16*.app /Applications/Xcode_15*.app 2>/dev/null | sort -V | tail -1)
if [ -n "$XCODE_PATH" ]; then
sudo xcode-select -s "$XCODE_PATH"
echo "Selected: $XCODE_PATH"
Expand Down
17 changes: 11 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ permissions:
jobs:
release:
name: Build & Publish Release
runs-on: macos-14
runs-on: macos-15

steps:
- name: Checkout repository
Expand All @@ -27,7 +27,7 @@ jobs:

- name: Select Xcode
run: |
XCODE_PATH=$(ls -d /Applications/Xcode_16*.app 2>/dev/null | sort -V | tail -1)
XCODE_PATH=$(ls -d /Applications/Xcode_16*.app /Applications/Xcode_15*.app 2>/dev/null | sort -V | tail -1)
if [ -n "$XCODE_PATH" ]; then
sudo xcode-select -s "$XCODE_PATH"
echo "Selected: $XCODE_PATH"
Expand All @@ -42,11 +42,15 @@ jobs:

- name: Resolve Release Tag & Notes
id: release_info
env:
INPUT_TAG: ${{ inputs.version_tag || github.event.inputs.version_tag }}
REF_NAME: ${{ github.ref_name }}
REF: ${{ github.ref }}
run: |
if [ -n "${{ github.event.inputs.version_tag }}" ]; then
TAG="${{ github.event.inputs.version_tag }}"
elif [ -n "${{ github.ref_name }}" ] && [[ "${{ github.ref }}" == refs/tags/* ]]; then
TAG="${{ github.ref_name }}"
if [ -n "$INPUT_TAG" ]; then
TAG="$INPUT_TAG"
elif [ -n "$REF_NAME" ] && [[ "$REF" == refs/tags/* ]]; then
TAG="$REF_NAME"
else
VER=$(grep '"version"' version.json | head -1 | sed 's/.*: *"\(.*\)".*/\1/')
TAG="v${VER}"
Expand All @@ -59,6 +63,7 @@ jobs:
tag_name: ${{ steps.release_info.outputs.tag }}
name: "MySound ${{ steps.release_info.outputs.tag }}"
generate_release_notes: true
fail_on_unmatched_files: true
files: |
build/MySound.dmg
build/MySound.zip
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,6 @@ __pycache__/
.venv/
venv/
ENV/

# Brainstorming Visual Companion
.superpowers/
2 changes: 2 additions & 0 deletions Entitlements.plist
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<true/>
<key>com.apple.security.system-audio-capture</key>
<true/>
<key>com.apple.security.device.bluetooth</key>
<true/>
<key>com.apple.security.app-sandbox</key>
<false/>
<key>com.apple.security.get-task-allow</key>
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
MySound gives you total control over your Mac's audio. Adjust the volume of individual applications like Chrome, Spotify, or Zoom independently of your system volume—all from a beautiful, minimalist menu bar interface.

<p align="center">
<img src="Resources/preview.png" width="440" alt="MySound UI Preview (v1.6.0)">
<img src="Resources/preview.png" width="440" alt="MySound UI Preview (v1.7.0)">
</p>

<p align="center">
<img src="https://img.shields.io/badge/version-1.6.0-blue.svg" alt="Version 1.6.0">
<img src="https://img.shields.io/badge/version-1.7.0-blue.svg" alt="Version 1.7.0">
<img src="https://img.shields.io/badge/platform-macOS%2014.2%2B-lightgrey.svg" alt="macOS 14.2+">
<img src="https://img.shields.io/badge/architecture-Universal%20(arm64%20%2B%20x86__64)-success.svg" alt="Universal Binary">
<img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License: MIT">
Expand Down
5 changes: 2 additions & 3 deletions Sources/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ import AppKit
/// `MySoundAppDelegate` handles macOS application lifecycle events that SwiftUI does not expose,
/// ensuring clean teardown of CoreAudio resources (aggregate devices, process taps) when the
/// app is terminated by the system (e.g. logout, shutdown, force quit).
@MainActor
class MySoundAppDelegate: NSObject, NSApplicationDelegate {
/// Called by macOS when the application is about to terminate (user quit, system shutdown, etc.).
/// Ensures all CoreAudio process taps and aggregate devices are destroyed cleanly.
func applicationWillTerminate(_ notification: Notification) {
Task { @MainActor in
AudioTapManager.shared.removeAllTaps()
}
AudioTapManager.shared.removeAllTaps()
}
}

Expand Down
Loading
Loading