1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00

You can press a button and a thing happens!

This commit is contained in:
Daniel Barber 2019-01-25 17:19:36 -05:00
parent 4e284d0a21
commit 0bed74b7d3
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
9 changed files with 205 additions and 29 deletions

View File

@ -15,6 +15,7 @@
E407863A2110CE70006887B1 /* PersephoneUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E40786392110CE70006887B1 /* PersephoneUITests.swift */; };
E41B22C021FB6BBA00D544F6 /* libmpdclient.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */; settings = {ATTRIBUTES = (Required, ); }; };
E41B22C121FB6C3300D544F6 /* libmpdclient.2.dylib in Embed Libraries */ = {isa = PBXBuildFile; fileRef = E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
E41B22C621FB932700D544F6 /* MPDClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = E41B22C521FB932700D544F6 /* MPDClient.swift */; };
E465049A21E94DF500A70F4C /* WindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E465049921E94DF500A70F4C /* WindowController.swift */; };
/* End PBXBuildFile section */
@ -65,6 +66,42 @@
E407863B2110CE70006887B1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libmpdclient.2.dylib; path = libmpdclient/output/libmpdclient.2.dylib; sourceTree = "<group>"; };
E41B22C421FB715A00D544F6 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
E41B22C521FB932700D544F6 /* MPDClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDClient.swift; sourceTree = "<group>"; };
E41B22C921FB966C00D544F6 /* connection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = connection.h; sourceTree = "<group>"; };
E41B22CA21FB966C00D544F6 /* protocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = protocol.h; sourceTree = "<group>"; };
E41B22CB21FB966C00D544F6 /* error.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = error.h; sourceTree = "<group>"; };
E41B22CC21FB966C00D544F6 /* recv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = recv.h; sourceTree = "<group>"; };
E41B22CD21FB966C00D544F6 /* client.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = client.h; sourceTree = "<group>"; };
E41B22CE21FB966C00D544F6 /* song.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = song.h; sourceTree = "<group>"; };
E41B22CF21FB966C00D544F6 /* response.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = response.h; sourceTree = "<group>"; };
E41B22D021FB966C00D544F6 /* status.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = status.h; sourceTree = "<group>"; };
E41B22D121FB966C00D544F6 /* tag.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tag.h; sourceTree = "<group>"; };
E41B22D221FB966C00D544F6 /* compiler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = "<group>"; };
E41B22D321FB966C00D544F6 /* settings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = settings.h; sourceTree = "<group>"; };
E41B22D421FB966C00D544F6 /* version.h.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = version.h.in; sourceTree = "<group>"; };
E41B22D521FB966C00D544F6 /* parser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = "<group>"; };
E41B22D621FB966C00D544F6 /* idle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = idle.h; sourceTree = "<group>"; };
E41B22D721FB966C00D544F6 /* message.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = message.h; sourceTree = "<group>"; };
E41B22D821FB966C00D544F6 /* player.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = player.h; sourceTree = "<group>"; };
E41B22D921FB966C00D544F6 /* output.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = "<group>"; };
E41B22DA21FB966C00D544F6 /* mixer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mixer.h; sourceTree = "<group>"; };
E41B22DB21FB966C00D544F6 /* list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = list.h; sourceTree = "<group>"; };
E41B22DC21FB966C00D544F6 /* async.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = async.h; sourceTree = "<group>"; };
E41B22DD21FB966C00D544F6 /* directory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = directory.h; sourceTree = "<group>"; };
E41B22DE21FB966C00D544F6 /* database.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = database.h; sourceTree = "<group>"; };
E41B22DF21FB966C00D544F6 /* entity.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = entity.h; sourceTree = "<group>"; };
E41B22E021FB966C00D544F6 /* pair.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pair.h; sourceTree = "<group>"; };
E41B22E121FB966C00D544F6 /* send.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = send.h; sourceTree = "<group>"; };
E41B22E221FB966C00D544F6 /* password.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = password.h; sourceTree = "<group>"; };
E41B22E321FB966C00D544F6 /* audio_format.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = audio_format.h; sourceTree = "<group>"; };
E41B22E421FB966C00D544F6 /* mount.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mount.h; sourceTree = "<group>"; };
E41B22E521FB966C00D544F6 /* sticker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sticker.h; sourceTree = "<group>"; };
E41B22E621FB966C00D544F6 /* search.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = search.h; sourceTree = "<group>"; };
E41B22E721FB966C00D544F6 /* socket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = socket.h; sourceTree = "<group>"; };
E41B22E821FB966C00D544F6 /* stats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stats.h; sourceTree = "<group>"; };
E41B22E921FB966C00D544F6 /* capabilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = capabilities.h; sourceTree = "<group>"; };
E41B22EA21FB966C00D544F6 /* queue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = queue.h; sourceTree = "<group>"; };
E41B22EB21FB966C00D544F6 /* playlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = playlist.h; sourceTree = "<group>"; };
E465049921E94DF500A70F4C /* WindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -118,6 +155,7 @@
E407861A2110CE6E006887B1 /* Persephone */ = {
isa = PBXGroup;
children = (
E41B22C721FB966C00D544F6 /* include */,
E407861B2110CE6E006887B1 /* AppDelegate.swift */,
E407861D2110CE6E006887B1 /* ViewController.swift */,
E407861F2110CE70006887B1 /* Assets.xcassets */,
@ -125,7 +163,7 @@
E465049921E94DF500A70F4C /* WindowController.swift */,
E40786242110CE70006887B1 /* Info.plist */,
E40786252110CE70006887B1 /* Persephone.entitlements */,
E41B22C421FB715A00D544F6 /* module.modulemap */,
E41B22C521FB932700D544F6 /* MPDClient.swift */,
);
path = Persephone;
sourceTree = "<group>";
@ -156,6 +194,57 @@
name = Frameworks;
sourceTree = "<group>";
};
E41B22C721FB966C00D544F6 /* include */ = {
isa = PBXGroup;
children = (
E41B22C421FB715A00D544F6 /* module.modulemap */,
E41B22C821FB966C00D544F6 /* mpd */,
);
path = include;
sourceTree = "<group>";
};
E41B22C821FB966C00D544F6 /* mpd */ = {
isa = PBXGroup;
children = (
E41B22DC21FB966C00D544F6 /* async.h */,
E41B22E321FB966C00D544F6 /* audio_format.h */,
E41B22E921FB966C00D544F6 /* capabilities.h */,
E41B22CD21FB966C00D544F6 /* client.h */,
E41B22D221FB966C00D544F6 /* compiler.h */,
E41B22C921FB966C00D544F6 /* connection.h */,
E41B22DE21FB966C00D544F6 /* database.h */,
E41B22DD21FB966C00D544F6 /* directory.h */,
E41B22DF21FB966C00D544F6 /* entity.h */,
E41B22CB21FB966C00D544F6 /* error.h */,
E41B22D621FB966C00D544F6 /* idle.h */,
E41B22DB21FB966C00D544F6 /* list.h */,
E41B22D721FB966C00D544F6 /* message.h */,
E41B22DA21FB966C00D544F6 /* mixer.h */,
E41B22E421FB966C00D544F6 /* mount.h */,
E41B22D921FB966C00D544F6 /* output.h */,
E41B22E021FB966C00D544F6 /* pair.h */,
E41B22D521FB966C00D544F6 /* parser.h */,
E41B22E221FB966C00D544F6 /* password.h */,
E41B22D821FB966C00D544F6 /* player.h */,
E41B22EB21FB966C00D544F6 /* playlist.h */,
E41B22CA21FB966C00D544F6 /* protocol.h */,
E41B22EA21FB966C00D544F6 /* queue.h */,
E41B22CC21FB966C00D544F6 /* recv.h */,
E41B22CF21FB966C00D544F6 /* response.h */,
E41B22E621FB966C00D544F6 /* search.h */,
E41B22E121FB966C00D544F6 /* send.h */,
E41B22D321FB966C00D544F6 /* settings.h */,
E41B22E721FB966C00D544F6 /* socket.h */,
E41B22CE21FB966C00D544F6 /* song.h */,
E41B22E821FB966C00D544F6 /* stats.h */,
E41B22D021FB966C00D544F6 /* status.h */,
E41B22E521FB966C00D544F6 /* sticker.h */,
E41B22D121FB966C00D544F6 /* tag.h */,
E41B22D421FB966C00D544F6 /* version.h.in */,
);
path = mpd;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -225,6 +314,11 @@
TargetAttributes = {
E40786172110CE6E006887B1 = {
CreatedOnToolsVersion = 9.4.1;
SystemCapabilities = {
com.apple.Sandbox = {
enabled = 0;
};
};
};
E40786292110CE70006887B1 = {
CreatedOnToolsVersion = 9.4.1;
@ -289,6 +383,7 @@
files = (
E407861E2110CE6E006887B1 /* ViewController.swift in Sources */,
E465049A21E94DF500A70F4C /* WindowController.swift in Sources */,
E41B22C621FB932700D544F6 /* MPDClient.swift in Sources */,
E407861C2110CE6E006887B1 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -471,10 +566,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 4.0;
SYSTEM_HEADER_SEARCH_PATHS = (
libmpdclient/include,
Persephone,
);
SYSTEM_HEADER_SEARCH_PATHS = Persephone/include;
USER_HEADER_SEARCH_PATHS = libmpdclient/output;
};
name = Debug;
@ -501,10 +593,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 4.0;
SYSTEM_HEADER_SEARCH_PATHS = (
libmpdclient/include,
Persephone,
);
SYSTEM_HEADER_SEARCH_PATHS = Persephone/include;
USER_HEADER_SEARCH_PATHS = libmpdclient/output;
};
name = Release;

View File

@ -693,7 +693,6 @@
<toolbar key="toolbar" implicitIdentifier="33DCB92B-74AF-496A-99FE-1F88002CB88A" autosavesConfiguration="NO" displayMode="iconOnly" sizeMode="regular" id="eNB-TI-KUS">
<allowedToolbarItems>
<toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="mhg-16-CNM"/>
<toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="NWn-Bn-Qn8"/>
<toolbarItem implicitItemIdentifier="2D01DD0F-DDD1-411E-9270-20E2B5B07FC2" label="Controls" paletteLabel="Controls" sizingBehavior="auto" id="p3r-ty-Pxf">
<nil key="toolTip"/>
<segmentedControl key="view" verticalHuggingPriority="750" id="Bbf-C6-1Gu">
@ -705,13 +704,15 @@
<segment image="prevTrackButton" width="32"/>
<segment image="playButton" width="48" tag="1"/>
<segment image="stopButton" width="32"/>
<segment image="nextTrackButton" width="32">
<nil key="label"/>
</segment>
<segment image="nextTrackButton" width="32"/>
</segments>
<connections>
<action selector="handleTransportControl:" target="B8D-0N-5wS" id="HTN-5E-y75"/>
</connections>
</segmentedCell>
</segmentedControl>
</toolbarItem>
<toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="9ol-aR-mzv"/>
</allowedToolbarItems>
<defaultToolbarItems>
<toolbarItem reference="p3r-ty-Pxf"/>
@ -762,13 +763,13 @@
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="S3o-nF-NN7">
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="S3o-nF-NN7">
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
<clipView key="contentView" drawsBackground="NO" id="WI8-Pw-03L">
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" multipleSelection="NO" autosaveColumns="NO" rowHeight="24" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="0Co-uF-CCB" id="jEJ-jg-fll">
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="sourceList" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="0Co-uF-CCB" id="jEJ-jg-fll">
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>

View File

@ -0,0 +1,62 @@
//
// MPDClient.swift
// Persephone
//
// Created by Daniel Barber on 2019/1/25.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import Foundation
import mpdclient
class MPDClient {
let HOST = "localhost"
let PORT: UInt32 = 6600
private let connection: OpaquePointer
private var status: OpaquePointer?
init?() {
guard let connection = mpd_connection_new(HOST, PORT, 0)
else { return nil }
mpd_connection_set_keepalive(connection, true)
self.connection = connection
}
deinit {
mpd_connection_free(connection)
}
func getStatus() {
status = mpd_status_begin()
}
func playPause() {
mpd_run_toggle_pause(connection)
}
func stop() {
mpd_run_stop(connection)
}
func prevTrack() {
mpd_run_previous(connection)
}
func nextTrack() {
mpd_run_next(connection)
}
func getLastErrorMessage() -> String! {
if mpd_connection_get_error(connection) == MPD_ERROR_SUCCESS {
return "no error"
}
if let errorMessage = mpd_connection_get_error_message(connection) {
return String(cString: errorMessage)
}
return "no error message"
}
}

View File

@ -1,10 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
</dict>
<dict/>
</plist>

View File

@ -7,7 +7,6 @@
//
import Cocoa
import mpdclient
class ViewController: NSViewController {
override func viewDidLoad() {

View File

@ -9,8 +9,36 @@
import Cocoa
class WindowController: NSWindowController {
enum TransportAction: Int {
case prevTrack = 0
case playPause = 1
case stop = 2
case nextTrack = 3
}
var mpdClient: MPDClient?
override func windowDidLoad() {
super.windowDidLoad()
window?.titleVisibility = .hidden
mpdClient = MPDClient()
mpdClient?.getStatus()
}
@IBAction func handleTransportControl(_ sender: NSSegmentedControl) {
guard let transportAction = TransportAction(rawValue: sender.selectedSegment)
else { return }
switch transportAction {
case .prevTrack:
mpdClient?.prevTrack()
case .playPause:
mpdClient?.playPause()
case .stop:
mpdClient?.stop()
case .nextTrack:
mpdClient?.nextTrack()
default:
break
}
}
}

View File

@ -0,0 +1,5 @@
module mpdclient {
umbrella header "mpd/client.h"
export *
module * { export * }
}

1
Persephone/include/mpd Symbolic link
View File

@ -0,0 +1 @@
../../libmpdclient/include/mpd

View File

@ -1,4 +0,0 @@
module mpdclient [system] {
umbrella "mpd"
export *
}