Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.
Some new features:

- Favorites list and History (recently added + recently played lists)
- Gesture recognition (3 finger swipe, 2 finger scroll) for essential player/playlist controls (track change, volume control, seeking, playlist scrolling)

FavsGIF.gif


Favs.png
 
Last edited:
  • Like
Reactions: Michaelgtrusa
Well I use only G5, I would like to try it, but unfortunatly I can't...looks goo thought!
 
Thanks ! Have you done a lot of software/hardware upgrading on it over the years ?
Don't really want to go out of topic here , because you deserve all the attention , but I have been running a dual 867 MDD till a couple of weeks ago with 756 mb ran and a geforce with 32 megs of ram (60 gb hd).

Currently on PowerMac G5 dual 2.0 Ghz with Geforce 6600 (upgrading to a Quadro 4500 next week....waiting for it to arrive from ebay). 5 gb ram and 80 gb HD.

Software wise I am running Office 2008, Adobe Creative Suite CS4, iLife 09, iWork 09, VLC, Logic Express ...

I mostly fo Vector graphics, so I spend my time 99% on Illustrator, and exporting to PDF / EPS allows me to stay compatible with 99% of the places I work with, and word...well that's still compatible.

Actually working in this environment is faster than running a current computer, sure the SW is dated and some work takes "longer" to achieve (as in steps...less automation in older SW) but really it feels snappy!!!

Now if i had to do anything video related the story would be very very different!

Now if more dev were making apps for fun on PPC it would be awesome....
 
Last edited:
  • Like
Reactions: 0002378
Don't really want to go out of topic here , because you deserve all the attention , but I have been running a dual 867 MDD till a couple of weeks ago with 756 mb ran and a geforce with 32 megs of ram (60 gb hd).

Currently on PowerMac G5 dual 2.0 Ghz with Geforce 6600 (upgrading to a Quadro 4500 next week....waiting for it to arrive from ebay). 5 gb ram and 80 gb HD.

Software wise I am running Office 2008, Adobe Creative Suite CS4, iLife 09, iWork 09, VLC, Logic Express ...

I mostly fo Vector graphics, so I spend my time 99% on Illustrator, and exporting to PDF / EPS allows me to stay compatible with 99% of the places I work with, and word...well that's still compatible.

Actually working in this environment is faster than running a current computer, sure the SW is dated and some work takes "longer" to achieve (as in steps...less automation in older SW) but really it feels snappy!!!

Now if i had to do anything video related the story would be very very different!

That is interesting. You don't really hear of too many people using PowerPCs like you. Thanks for sharing.
 
That is interesting. You don't really hear of too many people using PowerPCs like you. Thanks for sharing.
That is because most of the time people work on internet or require internet for work and PowerPC for that is...well unsupported and slow, and progress.. well people (and I used to as well) feel the need to have the latest and greatest.

I used to want the latest myself, till i got a MacBook pro 2016 this year, i then sold it in August and went back to My iMac G4 ....boy that was slow on Leopard :p.

I later upgraded to a MDD wich got for pennies and things on Tiger were awsome...then I thought I am goping to go vintage let's rock it ...

The dual G5 costed me 80 bucks with the quadro coming at 8 euros (it was a 2500$ update back then).. all in all with 180 $ i have an MDD wich is my "server" and the G5 wich is my main machine, and cannot regret a bit!

For internet i use an iPad (12.9 2nd gen iPad Pro) but really it is for surfing and very little else....

The reality is, for what I do (and i suspect many other usages) you do not really need to have the latest SW and the latest HW, I hear people running iMacs for Office and emails... now for sure i am onthe "extreme opposite", but spending 2k (in the case of the MBP it was close to 3K) should grant me a lot more than what I am doing with my 180 $ investment.

Again usage might vary but CS 4 and Illustrator V10 can do pretty much everything you can with the current CC, so using internet is not worth to me the 2500+ difference.

PowerPC + iPad for me was the winning combination!
 
That is because most of the time people work on internet or require internet for work and PowerPC for that is...well unsupported and slow, and progress.. well people (and I used to as well) feel the need to have the latest and greatest.

I used to want the latest myself, till i got a MacBook pro 2016 this year, i then sold it in August and went back to My iMac G4 ....boy that was slow on Leopard :p.

I later upgraded to a MDD wich got for pennies and things on Tiger were awsome...then I thought I am goping to go vintage let's rock it ...

The dual G5 costed me 80 bucks with the quadro coming at 8 euros (it was a 2500$ update back then).. all in all with 180 $ i have an MDD wich is my "server" and the G5 wich is my main machine, and cannot regret a bit!

For internet i use an iPad (12.9 2nd gen iPad Pro) but really it is for surfing and very little else....

The reality is, for what I do (and i suspect many other usages) you do not really need to have the latest SW and the latest HW, I hear people running iMacs for Office and emails... now for sure i am onthe "extreme opposite", but spending 2k (in the case of the MBP it was close to 3K) should grant me a lot more than what I am doing with my 180 $ investment.

Again usage might vary but CS 4 and Illustrator V10 can do pretty much everything you can with the current CC, so using internet is not worth to me the 2500+ difference.

PowerPC + iPad for me was the winning combination!

For what it's worth, I'm on a 2009 Macbook Pro, and I'm loving it more everyday :D I don't feel the slightest urge to upgrade to a newer machine. I recently put a Samsung EVO SSD, 8 GB RAM, and a 2TB storage drive (2nd drive) in it, and I'm good to go for a while ! Hacked Sierra on it ... lovin it !
 
  • Like
Reactions: YaBe
This update is out now?

Yup, you can get it here: https://github.com/maculateConception/aural-player/blob/master/Aural.dmg?raw=true

Currently, the size of each of the 3 history lists is set to a fixed size: 25 items. This will be configurable soon.

As for gesture recognition, here are the currently recognized gestures, for reference:

(Scroll sensitivity/speed will also be configurable soon)

Player gestures (mouse cursor over the main window, i.e. outside the playlist window):
3 finger swipe left/right - Previous/Next track
2 finger scroll left/right - Seek backward/forward
2 finger scroll up/down - Increase/decrease volume

Playlist gestures (mouse cursor over the playlist window):
3 finger swipe up/down - Scroll to top/bottom of playlist
3 finger swipe left/right - Switch playlist view tabs (Tracks/Artists, etc)
(Two finger vertical scrolling is enabled by default, and is unchanged)
 
Last edited:
  • Like
Reactions: Michaelgtrusa
Added a contextual menu (triggered by right click / control click) to the playlist. Now, a track can be favorited directly from the playlist. Also, detailed track info can now be viewed directly from the playlist, unlike before. Previously, these 2 functions were only available on the playing track.

The feature has been released: App download link

TrackMenu.png


GroupMenu.png


CMenu-AddToFavs.gif


CMenu-DetailedInfo.gif
 
  • Like
Reactions: Tobias_Dunkel
Sorry for the late reply. I have been quite busy during the last few days.
But as I see you're making great progress as always.

First of all, I can’t thank you enough for how much effort you’re putting in your posts to help me out! Thank you so much!! :)
Especially your last reply to me with the summary of all the important aspects of programming. This really helped a lot, and while there were few things I already knew there also was a lot of new stuff for me to learn.
Even thought I am not sure how deep I will dive in here. After all I'm not doing this professionally and don't intend to. Plus it won't be possible anyway, since I have no degree or whatsoever in CS.
I'm just doing it because it's fun and maybe one day I can realize my own apps from the ideas I have.

Now back to your last posts:

Really like the new features you have added meanwhile, especially the context menu in the playlist.

The gestures are also working flawless, besides I cannot use those 3-finger-swipes those are already assigned to dragging in the system settings. Which also leads to the problem that dragging the seek slider with that gesture isn't working anymore. More precisely, pulling the slider itself works, but when I release it it sets back to where it was and nothing happens (click drag still works fine though).

The new Icons for the effect tabs also look great. Did you make them yourself? If so, you did a good job for sure.
Another thing I would probably implement is a bypass for the equalizer like all the other effects. Thus also giving it a power button switch.

Regarding splitting the playlist and effect tabs I think that's probably a bit too much, not that i think about it. Leads to even more subfolders in the Project Navigator. Maybe it just takes a while to get used to it. On the other hand the NowPlaying view and stuff is great to have separate.

another bug report (kind of):
When I try out your latest release I have a lot of problems with the playlist docking. On my Macbook it doesn't really work like it should. Also the animation for docking, I don't like it at all. Looks and behaves a little awkward and feels sluggish overall.

---

What I have done in the meantime were watching some WWDC conferences and doing some more tutorials and reading some more articles. Not much really (like i said, was too busy the last days :p)

Also I did some exploration with table/outline views. Mostly because I wanted to get more familiar with NSOutlineView. But also tried out some stuff regarding performance, and have some more possible optimizations to be added. Also tried out how inplace remapping would turn out compared to having separate tabs. Regarding memory and CPU it didn't look so bad and performance is already great even in fullscreen, but haven't done profiling with Instruments yet. Still what I wanna do for even superior performance is adding better caching of reused table cells and also try a different apprach for laying out the table cells itself (watched a WWDC talk which gave me some inspiration here)

This is the current project I have uploaded to my Github in case you wanna have a look at it (not sure if you can open it, since I'm using XCode 9.1):
https://github.com/Dunkeeel/NSTableViewGroupRows/tree/master

One more thing :apple::
I think those floating headers would be nice to have in the grouped views of the playlist.
Not sure if it would be easy to implement, in my examle it was easy but after all this is just a very simplified version.
 
  • Like
Reactions: 0002378
Sorry for the late reply. I have been quite busy during the last few days.
But as I see you're making great progress as always.

Hey, welcome back ! Thanks for the feedback.

So, you mentioned problems with the 3-finger swipe (because of your system settings), but what about the 2-finger scrolls for seeking and volume ? Did they work ok ? I remember you saying that you would like the 2-finger scroll for seeking to be implemented, so I was just wondering how that worked for you.

Also, what problems did you have with the docking ? Can you share a few more details when you have time. I'd appreciate it. I can disable the animation if it looks awkward ... easy.

I think it's great that you're doing programming on the side. You can sell apps on the App store and make some good money, if you feel like it. I could never do that because if Apple sees my code, they'll have a heart attack because of how much I love not doing things their way :D

BTW, I was just thinking that I could make the different gestures configurable, so people can enable/disable individual gestures depending on their system settings. For example, you could disable the 3-finger swipes and keep the 2-finger scrolls because of your system settings. Also, I'm planning to add scroll sensitivity as a preference (low/medium/high), which will affect how fast the scroll affects your seeking/volume changes.
[doublepost=1510993345][/doublepost]
Regarding splitting the playlist and effect tabs I think that's probably a bit too much, not that i think about it.

Hey, you got me started, dude :p Now, you can't stop me, hahaha !

BTW, if you have trouble navigating the project files in XCode, just use the keyboard shortcut Shift-Command-O and start typing the name of the file you're looking for.

If you wanna be a programmer, get comfortable with keyboard shortcuts (you mentioned not being a shortcut guy) :p
 
Last edited:
So, you mentioned problems with the 3-finger swipe (because of your system settings), but what about the 2-finger scrolls for seeking and volume ? Did they work ok ? I remember you saying that you would like the 2-finger scroll for seeking to be implemented, so I was just wondering how that worked for you.

I guess the problem maybe is because content window dragging is enabled. So for me, doing a 3-finger swipe moves the window around. 2-finger-scrolling however, in this case, isn't interfered since there's no scroll view in the main window. So that gesture is free to use, and yes, 2-finger-seek works fine.

BTW, I was just thinking that I could make the different gestures configurable, so people can enable/disable individual gestures depending on their system settings. For example, you could disable the 3-finger swipes and keep the 2-finger scrolls because of your system settings. Also, I'm planning to add scroll sensitivity as a preference (low/medium/high), which will affect how fast the scroll affects your seeking/volume changes.

Suggestion for improvement:

- make seek and volume gesture mutually exclusive (they kind of already are), so when you started a seek action you cannot adjust volume until you completely lifted your fingers/aborted the scroll action or at least have a slight delay until you can change to the other scroll direction. The reason is, sometimes you want to seek and accidentally adjust the volume

- another point would be to maybe restrict volume adjusting to the playerControlsView (where the actual volume slider is) and restrict seek to nowPlayingView (where the actual seek slider is). This would enable a possible 2-finger gesture for changing tracks when the mouse is in the playerControlsView. Alternatively disable window moving for the playlistControlsView, so 3-finger-gesture would work.

- instead of a sensitivity setting you could add accelerated scrolling sensitivity to the scrolling gesture, so the faster you scroll the higher the impact. Maybe you could have a look at IINAs source code since they have implemented this, even though the code looks a bit messy. This method in MainWindowController is related to the scrolling gestures:
'override func scrollWheel(with event: NSEvent)'

Also, what problems did you have with the docking ? Can you share a few more details when you have time. I'd appreciate it. I can disable the animation if it looks awkward ... easy.

For example docking the playlist when main window movement is involved to make space to the playlist both windows overlap and it looks something like this:

Aural 2017-11-18 at 17.44.41.png

So the problem here is (example):
- main window is closer to the left screen edge than the width of the playlist
- playlist gets moved first with restricted alignment to the screen
- so now, since the playlist is wider both windows overlap
- and only now the main window moves away from the edge (playlist window moves along with the main window)

To solve this (better solution in the edit below), you should first move the main window to make space. After that dock the playlist window so it will automatically align with the screen edge.
So just switch the sequence of those two actions (moving and docking)

Edit: either you do it like I described, or you keep the order but do not restrain the playlist window from going off the screen, since it will be dragged back into the screen automatically when the main window moves. Thats probably the better solution.

---

Also i would really consider to move the docking controls to the main window, like I did.
After all the main window docks the playlist to itself, not the other way around (that's what I think).

Plus changing the docking orientation is much faster since I'm always closer to the buttons after docking.

Hey, you got me started, dude :p Now, you can't stop me, hahaha !

An idea I had was maybe turn the effects into popover views only leaving the effect buttons permanently visible.
This way the size of the effect view can be independent. So when you need more space for the Equalizer by adding additional features to it, you can make the view bigger.

My idea here was:
- clicking for example the equalizer button opens a popup for the equalizer
- as long as a popup is already open, hovering over the other buttons automatically opens them, for example the equalizer is shown and mouse moves to pitch, the popover automativally changes to that.
- an example of a similar behavior without the hovering would be the object library in Xcode.
There, when you click an object the popover appears. When you click the next object the popover switches while even keeping the position unless the 'arrow thingy' gets out of range.
- Pressing 'TAB' when a popup is open switches to the next effect ('Shift+TAB' goes to the previous one)

That's about it. Maybe you can tell me what you think about this approach.

If you wanna be a programmer, get comfortable with keyboard shortcuts (you mentioned not being a shortcut guy) :p

Yeah, I know i should learn those shortcuts. Only use the most basic ones right now for quick help and all this stuff. I'm used to Shift+Cmd+P and Cmd+P from Sublime Text :D, so i think Shift+Cmd+O should be easy enough to remember for me. Thanks :D

Another problem is, having a german keyboard layout many keyboard shortcuts simply do not work.
Sometime there are characters involved I can only get by holding shift. But then the shortcut still won't work.

---

One thing I'm also dealing with at the moment (besides DI) is Core Animation debuging in macOS to significantly improve performance. Found an article about that here:
http://jwilling.com/blog/debugging-core-animation-on-osx/

Also 'WWDC 2014 - Session 220 - macOS' at around 44:30 minutes has some interesting facts about layer behavior regarding performance.
https://developer.apple.com/videos/play/wwdc2014/220/

So how is that information helpful?
Will need to confirm this, but maybe when the gif images are shown the whole window gets updated permanently, thus leading to the heavy impact on the CPU. (this is only a guess)

Also when you take a look at my OutlineView example you can maybe also have a look at the difference of CPU and memory when enabling/disabling CALayer of the Views. When enabled, the CPU goes down while scrolling, but memory goes up because the cells are cached as an image file with CALayer enabled (at least that's how I read it).
 
Last edited:
Suggestion for improvement:

- make seek and volume gesture mutually exclusive (they kind of already are), so when you started a seek action you cannot adjust volume until you completely lifted your fingers/aborted the scroll action or at least have a slight delay until you can change to the other scroll direction. The reason is, sometimes you want to seek and accidentally adjust the volume

This is exactly how it is implemented at the moment. I took everything you just mentioned into consideration. Your description is almost an exact translation of my code (look in GestureHandler). In fact, I had to, because I immediately noticed that problem (when scrolling diagonally, both seeking and volume are affected simultaneously). And yes, there is a delay of 1/6 seconds, i.e. one sixth of a second, between gestures. If I'm scrolling mostly up (most events have a greater dy than dx), and I suddenly receive a scroll left/right within that time interval ("scroll session" I call it) it will be smartly ignored. I played around with different time intervals, and tested each one. 1/6 seems to work quite well (no overlap between gestures) and still allows the controls to be quite responsive.

- another point would be to maybe restrict volume adjusting to the playerControlsView (where the actual volume slider is) and restrict seek to nowPlayingView (where the actual seek slider is).

I don't agree with this at all. First and foremost, no user in the world will be able to figure this behavior out without spending time on it ... this would result in most users not even being able to use the gestures and they will give up on it. Secondly, even if the user knows how it behaves, that behavior would make it more difficult for the user who would have to first move the mouse cursor all the way up to the player controls box. And if he overshoots and goes above it, "Oh ****, let's go down now". Not a good user experience. It is already a bit annoying if he is over the playlist window and has to move it up/left/right to the main window. It shouldn't be made more difficult. The whole point of a gesture is ease of use and convenience, so let's keep it simple. If you're over the main window, you're manipulating controls on it. If you're over the playlist window, you're controlling the playlist view.

Check out the VLC media player's scrolling behavior (VLC is my preferred video player). You don't have to be over the controls box to trigger those functions with gestures. Anywhere over the screen, your gesture will take effect. This is easy for the user.

This would enable a possible 2-finger gesture for changing tracks when the mouse is in the playerControlsView. Alternatively disable window moving for the playlistControlsView, so 3-finger-gesture would work.

Since I don't agree with restricting the scrolling to the player controls view, the first point here doesn't apply. However, I'm considering the 2nd option - disabling window moving, so that the 3-finger gesture works. That's not a bad idea. But, even if it is done, it should be configurable. Let the user decide what is more important - the Aural player 3-finger gesture, or the general MacOS one (window moving).

- instead of a sensitivity setting you could add accelerated scrolling sensitivity to the scrolling gesture, so the faster you scroll the higher the impact. Maybe you could have a look at IINAs source code since they have implemented this, even though the code looks a bit messy. This method in MainWindowController is related to the scrolling gestures:
'override func scrollWheel(with event: NSEvent)'

That sounds like a good idea. It's best to manipulate the underlying gesture itself, instead of setting different numerical values for how fast the scroll affects the controls. However, again, this still needs to be configurable. Only, what happens behind the scenes will now be different (affecting the low-level scroll gesture itself, instead of what happens afterwards).

For example docking the playlist when main window movement is involved to make space to the playlist both windows overlap and it looks something like this:

View attachment 736751

So the problem here is (example):
- main window is closer to the left screen edge than the width of the playlist
- playlist gets moved first with restricted alignment to the screen
- so now, since the playlist is wider both windows overlap
- and only now the main window moves away from the edge (playlist window moves along with the main window)

Wow, I tested my docking/maximize code for hours upon hours, and it never did anything like that. Is this specific to High Sierra, I wonder ? I seriously tested it a thousand times, and that kind of overlap never happened - not one single time. But, thanks for letting me know.

To solve this (better solution in the edit below), you should first move the main window to make space. After that dock the playlist window so it will automatically align with the screen edge.
So just switch the sequence of those two actions (moving and docking)

Edit: either you do it like I described, or you keep the order but do not restrain the playlist window from going off the screen, since it will be dragged back into the screen automatically when the main window moves. Thats probably the better solution.

Well, since I never saw that problem with the way it is now, I don't see why the order needs to be changed. I put a lot of thought into it, and a TON of testing, and it never failed. I do have one idea - I'm going to disable the window animations. Theoretically, that shouldn't fix the problem, but you never know. I know for a fact that animating the windows results in more window events (captured by NSWindowDelegate) than not animating them. I tried this out when I was working on that code. Maybe the animation is screwing up the positioning. I will disable it in my next build, and let's see if that fixes it.

Either way, I think it will need to be tested on your system, so I think the better solution is for you to change the code on your system (if/when you have time), test it, and post the solution. I will not be able to test it on my system, since I'm running Sierra and everything already works perfectly. So, it will be very inefficient for me to come up with a "fix", submit it, you test it, come back to me saying it doesn't work, etc. If you write the code, you'll be able to immediately test it and modify the code as needed. Hope this makes sense ?

Alternatively, can you note down an exact sequence of steps, so I can try to reproduce it on my system ? Starting from app startup, to the point where the improper docking occurs, step by step. And I will try to reproduce it here. (The problem is I can only test on Sierra)

Something like this would be great (if you have time):
- Set view preference for window location to be "Center" and playlist docking location to "bottom"
- Quit Aural
- Start Aural
- Drag window all the way to the right
- Dock playlist to right
- ERROR: Playlist window overlaps main window

---
Also i would really consider to move the docking controls to the main window, like I did.

Nah, I don't think so :) On the contrary, ask the question, "What is being docked ?" The playlist is being docked, so let the controls be on the playlist window. Put them on the main window and no one will ever figure out what those controls are. Now, one exception to this rule is the buttons that show/hide FX and playlist. Those 2 buttons need to be on the main window, because the main window is always visible. So, if you hide the playlist and need to show it again, you can only do so if the button is visible. So, it makes sense to have those 2 buttons on the main window. But, the controls to dock the playlist are specific to the playlist, so ...

Remember - most users want things to be quick and intuitive. Things need to be readily accessible and easy to figure out. Very few people are going to put their mouse cursor over the controls over the main window to see what they do. If they wanna move the playlist, they will look at the playlist window. "Let's see what these buttons do. Oh that icon looks like docking icon. This is the playlist window, so that control docks the playlist."

An idea I had was maybe turn the effects into popover views only leaving the effect buttons permanently visible.
This way the size of the effect view can be independent. So when you need more space for the Equalizer by adding additional features to it, you can make the view bigger.

Hmmm ... this is food for thought. Definitely open to consideration. I'm not saying yes or no right now, but will think about it.

---
One thing I'm also dealing with at the moment (besides DI) is Core Animation debuging in macOS to significantly improve performance. Found an article about that here:
http://jwilling.com/blog/debugging-core-animation-on-osx/

Also 'WWDC 2014 - Session 220 - macOS' at around 44:30 minutes has some interesting facts about layer behavior regarding performance.
https://developer.apple.com/videos/play/wwdc2014/220/

So how is that information helpful?
Will need to confirm this, but maybe when the gif images are shown the whole window gets updated permanently, thus leading to the heavy impact on the CPU. (this is only a guess)

Also when you take a look at my OutlineView example you can maybe also have a look at the difference of CPU and memory when enabling/disabling CALayer of the Views. When enabled, the CPU goes down while scrolling, but memory goes up because the cells are cached as an image file with CALayer enabled (at least that's how I read it).

Kudos on doing the research ! This is exactly the kind of input I could use, because I don't have the time or patience to do it myself (remember my #1 and #2 priorities :D). So, it is great that you are researching these things and providing input that can be applied to Aural. Keep it up.

BTW, about your outline view example app, can you please upload a GIF demo. I'm not able to run your code (old XCode and Swift v), and just looking at the code is not going to give me any idea how it works. Post a 30 second GIF clip demonstrating what it does. Keep the CPU/memory monitor (in XCode) open so I can see how your app impacts those parameters.

LiceCap is a great screen capture (to GIF) tool. All my GIFs I post here were done by LiceCap.
[doublepost=1511040020][/doublepost]
So the problem here is (example):
1- main window is closer to the left screen edge than the width of the playlist
2- playlist gets moved first with restricted alignment to the screen
3- so now, since the playlist is wider both windows overlap
4- and only now the main window moves away from the edge (playlist window moves along with the main window)

Actually, point #2 is incorrect. The playlist, when it moves initially, is not restricted in any way (I just revisited the code, in addition to testing it 10 more times). It goes wherever it needs to go for the docking. Yes, playlist does move first, but it is unrestricted in its movement.

Then, if the playlist is off-screen, both windows move. BTW, you're also mistaken that the playlist moves along with the main window. Yes, it will visually move, but the underlying frame does not move. I spent hours on this problem, till I realized that moving only the main window will also move the playlist window visually, but the playlist frame stayed where it was. At first, I didn't understand this behavior at all. If the playlist moves visually, its underlying frame should also move, but for some reason, it doesn't.

Maybe, somehow, this was a bug on Sierra, and I compensated for it in my code. Then, Apple fixed it in High Sierra (so the underlying frame moves with the window), and so you're now seeing the extra playlist movement causing the overlap ?

I guess I will have to change how the code is written, after all. Currently, I'm using affine transformations, which was a big mistake. I should be using absolute locations, like I was before.

:(
 
Last edited:
Love discussions. This way you get different views for a problem, and also ones you haven't thought about before.
So theres a few things you mentioned where I still disagree.

I don't agree with this at all. First and foremost, no user in the world will be able to figure this behavior out without spending time on it ...

I can understand that you don't like my idea. Still the second part, that no user would figure that out, I think is totally not the case. After all this is more like the default behavior. You control whats beneath the mouse. When you have a SplitView you control the view your mouse is over.

You don't have to be over the controls box to trigger those functions with gestures.

Regarding that VLC player example i also think it's a bad comparison. After all there's only that single control box that is visible, second that controls box and the video belong together and are like the same control box (often in video players the controls box is even just a HUD window, which automatically disappears). So its a single closed control unit. I mean, you click on the video, it pauses. You swipe it seeks. So after all you're controlling whats beneath your mouse...the video.

Open any sidebar in VLC put your mouse over it and scroll...well i haven't installed VLC but it will probably scroll the sidebar, not adjust the volume. Well not you can say that's the same with Aurals playlist window. For me, it's not.
For me Playlist, NowPlaying into, Controls and effects are separate units.

In that regard it would also make sense to move the seek bar to the player controls. Which could solve the weird UI layout of the Album cover not having the same distance to the container.

Coming back to why I have my specific opinion:
Maybe someone expects to be able to scroll on the Now Playing info, or any other kind of view. Or thinks he can change the effect tab with a swipe, or change any of the slider by hovering over them and scrolling, and whoops you just did something completely different.

For me gestures aren't all about having them instantly available (for those there are keyboard shortcuts), for me those gestures are for convenience. You can dial in values with greater precision and on a different scale then you do directly with a mouse. For example I have a small volume slider. When I want to adjust it by a few percent, its probably impossible with a mouse. But a gesture can have a sensitivity to it and i don't have to precisely hit a specific spot, just be near the control.

Maybe off topic but gestures on a smartphone mostly behave the same way. I control whats beneath my finger. Theres a bottom bar which i want to slide up. I put my finder on that bar and swipe. There's a hidden sidebar menu. I put my finger all the way to the side and swipe over. You don't do that from anywhere on the screen.

Maybe you can convice me to agree with you, but you need some other example for it, not that VLC player one.

Wow, I tested my docking/maximize code for hours upon hours, and it never did anything like that. Is this specific to High Sierra, I wonder ? I seriously tested it a thousand times, and that kind of overlap never happened - not one single time.

Well for me it's the opposite. I haven't had a single time where it worked when the main window had to move.
when the main window is plain center and the playlist has enough space it's fine. But as soon as main window movement is involved it's broken.

So no need for a sequence of steps. It's not like it randomly doesn't work. It consistently doesn't on my system.
But I sure can give you a fix for that when I have some time (probably even tomorrow).

Remember - most users want things to be quick and intuitive. Things need to be readily accessible and easy to figure out.

Quick and intuitvie and especially readily accessible would be my way (having the buttons on the main window), while easy to figure out would be probably your way.

For me:
playlist is hidden. I click dock right and it automatically shows, and docks itself right...one click of a button, on a window im already positioned with my mouse. If i decide to rather have it on the bottom. Just move the mouse a few pixel and there you have it dock bottom button right there for you to click.

Your way:
Click show playlist on the main window. Playlist pops up on the bottom, which i also dislike. It should remember it's last position and state. If someone then decides to only it docked to the bottom than he has is docked to the bottom anyway when he shows the playlist. After the playlist showed up you decide you'd rather have it on the left, so you have to go all the way to the playlist and click dock left. So much mouse movement involved, since the buttons always move away from you.

Also, the main window controls the position of the playlist anyway (since when you drag it, it follows). At least partly. So why not also let it control the docking?

Well but I guess here we just have different preferences which will stay that way. After all that's why customization is such a great thing, so everyone can have it like he wants. So the best tradeoff would probably be, having the controls on both window and hide it on one of them, depending on a setting in the preferences. ;)

BTW, about your outline view example app, can you please upload a GIF demo

Did indeed record some gifs to show the floating headers. The behavior on switching tabs. And the performance with CALayer enabled/disabled. Used giphy capture for that and uploaded it on their page. So they have 60fps and you can see the difference and smoothness better.

Demo:
https://giphy.com/gifs/xUOxeVmCaU3U9Dhi5W

CALayer disabled:
http://www.giphy.com/gifs/3o6fJ8pErz4lcAQxl6

CALayer enabled:
http://www.giphy.com/gifs/xUOxf7wGVGPVDmeYOA

As you can see, the performance difference is HUGE.
But caching the cells and improving auto layout should improve the performance even more (so I guess)

And this is the whole view structure:
xcode_project.jpg
Theres no tab view or whatsoever involved. Just remapping the tracks array. And only a one data model for a single track. But if you're interested in the code you could probably just check out the github.

Actually, point #2 is incorrect. The playlist, when it moves initially, is not restricted in any way

Ok you are right on that one. The playlist moves off screen here, too. But i guess it automatically snaps back to the screens visible frame and then additionally moves with the main window.

If the playlist moves visually, its underlying frame should also move, but for some reason, it doesn't.

I know this behavior, since I encountered it when I did my single window dual view.
I can give you additional information about that if you want. But not right now, It's already late here.

Currently, I'm using affine transformations

Affine transformation is totally fine, there no problem with using it. But I will write something about the visual frame having different size and position than the underlying window layer...probably tomorrow :D
 
For now, let's agree to disagree about the gesture behavior and playlist dock controls. We've discussed it, and we've hit a brick wall. No point in carrying on that particular discussion. Glad we had it though.

Yes, we have different ways of doing things, and that is to be expected, of course. That is why I wanted to have separate code bases. And, maybe that is why we will never have that master Swift 4 branch I was thinking of having, with both our changes, because who will decide what makes it in there ? :D

That's totally fine. There is no pressure, no requirement, no deadline, to do it a certain way, which is the underlying theme of this project - no pressure ... the day that changes, I'm no longer on this project. You can do it your way and I can do it in mine.

Alright, that aside, about the window positioning, I really think that we've encountered a bug with Apple's windowing logic. Why would the same code work flawlessly on mine and never on yours ?

The reason I don't like the affine transformation is because it has a prerequisite that the window needs to be in a certain absolute location prior to the transformation. Now, under normal circumstances, that would be a nice way to do things. But clearly, that doesn't work. If I could have confidence that macOS put my window where it should be prior to transformation, then I'd do it that way.

I think what I have to try now is to change the sequence of operations in my docking logic, as you suggested. Make room for the playlist window first, then dock the playlist ... instead of moving the whole thing after docking, which should have always worked but thanks to a low-level bug, doesn't.
[doublepost=1511054566][/doublepost]
Your way:
Click show playlist on the main window. Playlist pops up on the bottom, which i also dislike. It should remember it's last position and state.

It seems to remember :) Not sure what you mean by this.

Now, if there is a certain scenario where it doesn't work, then that is a genuine bug, it's not the way I wanted it to be. The intended behavior is to remember (if told to remember, in the View preferences).

After I "fix" the docking, I will do thorough testing to see if I can also reproduce the bug you're talking about.

remember.gif


remember2.gif
 
Last edited:
Maybe you could have a look at IINAs source code since they have implemented this, even though the code looks a bit messy. This method in MainWindowController is related to the scrolling gestures:
'override func scrollWheel(with event: NSEvent)'

I took a look at IINA's scroll wheel function. They're not doing anything magical in there. There is nothing related to device-level acceleration in their code. They're using the device to figure out natural vs inverted scroll direction. But, the so called "acceleration" is just them using a (probably configurable) multiplier value which is exactly what I was going to do anyway.

When you told me they're doing something with scroll acceleration, I thought they're manipulating the underlying device itself. In other words, changing how much deltaX and deltaY the event produces. And, that would have been a nice solution too (although in no way superior to the simpler alternative). They're doing no such thing.

Essentially, they're doing:
deltaX = event.scrollingDeltaX
seekAmount = deltaX * relativeSeekAmount (where relativeSeekAmount is retrieved from some UserDefaults preferences map).

Which is precisely what I had in mind to begin with :)
 
P.S. Disagreements aside, I do like your idea of a bypass switch for the EQ, and that has long been an ongoing debate within the confines of my mind :) On the one hand, I don't see why anyone would want it disabled. On the other hand, from a DSP / signal processing perspective, it makes perfect sense to be able to bypass the EQ.

I suppose that if someone wants the original sound, entirely unmodified, then, I guess he would disable all signal processing units. I can see a use case for it.

I also like your idea of using Tab and Shift + Tab to switch tabs. But, which tab view will those shortcuts affect ? Effects or Playlist ?

And, I'm going back to the learning laboratory to figure out a robust solution to the docking problem that emerges every so often (at least on some "advanced" systems :p). I don't want to put any band-aids or putty on it anymore. I want to solve it once and for all, so I'm going to try to rewrite the whole damn thing, so I don't have to ever revisit it again.
 
Last edited:
It seems to remember :) Not sure what you mean by this.

this is what i mean:
http://www.giphy.com/gifs/l2QDYlmL2x1pEkIAo

I expect the playlist to remember the state, not suddenly dock at the bottom again. Plus you can also clearly see the windows overlapping here.

I took a look at IINA's scroll wheel function. They're not doing anything magical in there. There is nothing related to device-level acceleration in their code.

Probably a misconception of mine. I just had a glance at the code. But most of the stuff I was too confusing for me to understand. But in the IINA player itself when you swipe slowly it doesn't seek as far compared to when you swipe quickly.

So I just assumed they did something in the code. Weirdly Aural behaves differently.
Ok, here is something you could try out...

with two fingers:
1. shaking up and down quickly, let go, repeat
2. swipe up slowly across the whole trackpad when volume is at 0%
3. swipe down slowly across the whole trackpad when volume is at 100%
4. repeat step 2 and 3 but do it quickly this time

In step one the volume slider tends to go in the direction you first started.
Here's a gif of all the steps done by me:
http://www.giphy.com/gifs/xUOxfhAQNuhfqZE9Gw

So I wonder if this is the same for you.
This means scrolling is speed sensitive in Aural as well, but somehow the opposite around like it should be in my opinion.

Plus is has some weird behavior sometimes. Like with the volume, sometimes is goes super quick then goes back to normal speed.

I don't see why anyone would want it disabled. On the other hand, from a DSP / signal processing perspective, it makes perfect sense to be able to bypass the EQ.

Why wouldn't someone have the ability to diable it. At the moment, when you want to disable the EQ, you have to make it flat. But when you want to have it back you have to re-do all the adjustments.

Also toggling EQ for before/after comparison is quite useful sometimes.

Plus I don't like the EQ font being green all the time. Doesn't fit well with the otherwise red highlight color.
Would be nice to have a single highlight color for the whole UI (active FX tabs, Sliders, FX toggle button, etc.)

And, I'm going back to the learning laboratory to figure out a robust solution to the docking problem that emerges every so often (at least on some "advanced" systems :p).

Code:
private func moveWindows(_ dx: CGFloat, _ dy: CGFloat) {
    [mainWindow, playlistWindow].forEach({
        $0.setFrameOrigin($0.origin.applying(CGAffineTransform.init(translationX: dx, y: dy)))
    })
}

This is where the problem is in case you're still looking for a solution.

Since playlist is a child window of the main window it moves together with the main window.
After that you move the playlist again by the same amount. So they overlap.

Anyway just getting rid of the 'for each' and just moving the main window is enough for it work work here.

But I wonder why you don't get the same behavior like me? Is the child window behavior different on your mac?
 
Last edited:
Probably a misconception of mine. I just had a glance at the code. But most of the stuff I was too confusing for me to understand. But in the IINA player itself when you swipe slowly it doesn't seek as far compared to when you swipe quickly.

So I just assumed they did something in the code. Weirdly Aural behaves differently.
Ok, here is something you could try out...

with two fingers:
1. shaking up and down quickly, let go, repeat
2. swipe up slowly across the whole trackpad when volume is at 0%
3. swipe down slowly across the whole trackpad when volume is at 100%
4. repeat step 2 and 3 but do it quickly this time

There is a simple equation that is applicable to anything and everything you do in life. It's the "efficiency" equation. I'm sure you must have encountered this in your mech. engg courses when learning about an internal combustion engine for instance.

Efficiency = Output / Input

= Energy transmitted from the air-fuel mixture to the pistons to the crankshaft to the transmission to the drive shaft to the differential to the wheels / air-fuel mixture energy (esp. fuel, since that's what we pay for)

= Money reaped / money invested

= Reward reaped / (Time + perspiration invested)

= Having a feature work reliably / effort invested in the feature

I honestly think you're overanalyzing every little thing. And frankly, I don't want to. I've tested the scroll behavior to my heart's content, and it works just fine. I'm perfectly happy with it, and am quite confident most people would be, unless they were on a mission to look for problems. I don't need to look at IINA or anywhere else ... I'm quite happy with my solution. And, if I do decide to go looking for a better solution, IINA will be the last place I look. I'm not looking to compete with IINA, and I really don't care how they've implemented anything.

I understand that we're on different paths here, with different priorities, which makes it all the more important to tell you that I am not setting out to build the absolute best thing out there, much less am I getting paid for my effort (my reward for me is my own enjoyment, which stops when I have to overyanalyze anything ... refer again to the efficiency equation). And as I mentioned in previous comments, I'm careful what I define as "best".

I'm setting out to build something that works "reasonably well and is simple" (and that, to me is the "best" solution). And I don't give a $#!t how IINA or the rest of the world has implemented it, as long as my solution works reasonably well :) Once I implement a feature, and see that it works reliably and reasonably well, I take satisfaction in it, and move on to the next thing, whether it's a new feature, or nothing related to this project. And, after roughly 5 months of testing Aural Player, I'm happy and proud to report that it does work phenomenally reliably and simply. And, if it's not good enough for you, there's no pressure to use it. All the power to you to take the code and improve it, or ... whatever ... I won't be offended, either way.

I'm not building an Airbus autopilot system. I really don't want to overanalyze every little thing. Sorry !

Now, if there is a bug, or a genuine difficulty in using a feature (like sluggish playlist scrolling, for which you did some excellent research), I'm happy to address it. But, that aside, I'd rather spend the extra time watching dogs hump each other, reading a book, or implementing a new feature.
 
Last edited:
Code:
private func moveWindows(_ dx: CGFloat, _ dy: CGFloat) {
    [mainWindow, playlistWindow].forEach({
        $0.setFrameOrigin($0.origin.applying(CGAffineTransform.init(translationX: dx, y: dy)))
    })
}

This is where the problem is in case you're still looking for a solution.

If I never ran my app, and just looked at that code, I would agree with you - the child should move with the parent. Where my disagreement with you arises from is the fact that I've tested this code 10,000 times and that it has never failed (if it had failed, I would never have committed this code in the first place). I'm convinced of the theory of what you're saying ... it's a no-brainer. But, the reality of it doesn't match up with the theory.

That said, I'm playing with a side project just to get this docking crap ironed out once and for all ... it has been more trouble than it's worth.
 
this is what i mean:
http://www.giphy.com/gifs/l2QDYlmL2x1pEkIAo

I expect the playlist to remember the state, not suddenly dock at the bottom again. Plus you can also clearly see the windows overlapping here.

What you're pointing out is different from what I thought you were referring to. I thought you were referring to it not remembering dock location across app startup. I.e. the following flow:
// Assuming you have configured preference to remember playlist dock location
- Dock to right
- Quit app
- Restart app
- It docks to bottom (bug)

The above is a genuine bug and I introduced it when I rewrote the docking logic a few days ago. I have now fixed it.

However, what your GIF shows is not a bug; it is intended behavior. I'll explain.

When you undock the playlist, the app can no longer be responsible for keeping track of what you've done with the playlist window, for a very simple reason: From the time you undock it, then hide it, to the time you re-display the playlist, the main window could have (and likely has) moved across the screen, and is perhaps in a location where the playlist will overlap it. So, if you undock, then hide, and finally show the playlist, it will dock it at the bottom by default, because there is no good way to "remember" what you did with the playlist window separate from the main window and then restore it later.

You might say, well let's do one of the following:
1 - Remember the absolute location of playlist
2 - Remember the relative location (offset) of playlist w.r.t. main window.
3 - Don't remember anything, just find an arbitrary place to put the playlist when re-displayed.

Solution 1 is bad because of the reason I already mentioned (possible overlap). Solution 2 is bad because if the main window moves in a certain way, re-displaying the playlist with the remembered offset may result in the playlist being shown totally off screen where you can't even retrieve it anymore and then the user is screwed ! They cannot access the playlist anymore. This would be a horrible user experience.

And solution 3, I just don't like one single bit :)

If you have any solutions in mind for how an undocked playlist can be "smartly" re-displayed after being hidden, please share them with me.

Bottom line - There is no satisfactory way that I can conceive of, for keeping track of, and subsequently re-displaying an undocked playlist window in such a way that it does not move off-screen and does not overlap the main window when re-displayed.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.