Recommended Posts

On 4/20/2018 at 8:57 AM, Raphaël G. said:

I'm fixing this issue. The LRC format has given me some headaches. But I'm now improving the LRC parser and adding some automated tests which will prevent behavior to change between releases.

I'll soon release a 15.5.14 beta 1, with these fixes. Give me a day or 2, as I'd like to spend some time getting this right.

Thanks man,  I have a possible feature request for a future version.  The download lyrics from section could be a sortable list.  Netease lyrics have timestamps available in some cases and I would like it to search that site first, followed by any others.

 

Another small bug:  my lyrics download timeout is Language_none seconds.  I'm not sure how long that is.

Dopamine 1.5.14 Beta 1 has just been released. Info + download here: https://www.digimezzo.com/2018/04/23/dopamine-1-5-14-beta-1/

Change log:

 

– [Changed] Before adding a collection folder, a check is now performed to ensure its content is accessible.
– [Changed] Improved parsing of lyrics
– [Changed] Updated the Korean translation
– [Fixed] We now don’t crash anymore when a collection folder’s content is not accessible.
– [Fixed] Fixed a small issue displaying lyrics download timeouts

On 21/4/2018 at 10:49 PM, Ned said:

Thanks man,  I have a possible feature request for a future version.  The download lyrics from section could be a sortable list.  Netease lyrics have timestamps available in some cases and I would like it to search that site first, followed by any others.

 

Another small bug:  my lyrics download timeout is Language_none seconds.  I'm not sure how long that is.

I've created an issue for the lyrics provider idea: https://github.com/digimezzo/Dopamine/issues/734

  • Like 1

Dopamine 1.5.14 Beta 2 has just been released. This is the change log:

 

– [Changed] Updated the Chinese (Simplified) translation
– [Changed] Decreased the minimum window size for people using vertical monitors
– [Fixed] Fixed a crash which occurs when indexing MP3 files which have corrupt headers

 

Download here

  • Like 3

Lately I have been moving a lot of large files from hard drive to hard drive and I notice while doing this that Dopamine starts skipping or having issues playing or retrieving the music file from the hard drive while its copying other files... is there a way to have an option where we can increase the memory cache size for dopamine to alleviate some of this?

 

Thank you! 

On 28/4/2018 at 2:23 AM, Ravensky said:

Lately I have been moving a lot of large files from hard drive to hard drive and I notice while doing this that Dopamine starts skipping or having issues playing or retrieving the music file from the hard drive while its copying other files... is there a way to have an option where we can increase the memory cache size for dopamine to alleviate some of this?

 

Thank you! 

You could try increasing the latency setting in Settings > Playback. I'm not sure if that will fully solve this issue though.

Hi everyone,

 

Dopamine 1.5.14 Release Candidate 1 has been released today. This is the change log:

 

– [Changed] Updated the Swedish translation
– [Fixed] Further improved scaling for narrower monitors

 

That last entry in the change log seems crazy in this day and age. But I have people using Dopamine on vertical monitors :)

 

Download here: https://www.digimezzo.com/content/software/dopamine/

 

@Ned How is lyrics support treating you in the 1.5.14 betas?

 

Enjoy!

  • Like 3

Sorry, I don't typically beta test.  How many betas did you release because the last one crashed on me.

 

Two beta's, okay.  I'll try this one out.  I get a crash when I edit lyrics on a song with no lyrics.  Hmm, it's happened once.  Hard to reproduce.

 

error getting lyrics from netease....

 

2018-04-29 20:31:31.048|Info|PlaybackService.PlaybackFinishedHandler|1278|Track finished: E:\Music\Video Game\Super Meat Boy! - Digital Special Edition\57 ---.mp3
2018-04-29 20:31:31.120|Info|PlaybackService.TryPlayAsync|1171|Playing the file E:\Music\Oasis\(What's the Story) Morning Glory-\06 [Untitled Track].mp3. EventMode=False, ExclusiveMode=False, LoopMode=None, Shuffle=False
2018-04-29 20:31:32.951|Error|LyricsFactory.GetLyricsAsync|44|Error while getting lyrics from 'NeteaseLyrics'. Exception: Object reference not set to an instance of an object.
2018-04-29 20:31:32.951|Error|LyricsControlViewModel.RefreshLyricsAsync|269|Could not get lyrics online E:\Music\Oasis\(What's the Story) Morning Glory-\06 [Untitled Track].mp3. Exception: Object reference not set to an instance of an object.
2018-04-29 20:31:32.952|Error|LyricsControlViewModel.RefreshLyricsAsync|284|Could not show lyrics for Track E:\Music\Oasis\(What's the Story) Morning Glory-\06 [Untitled Track].mp3. Exception: Object reference not set to an instance of an object.
2018-04-29 20:31:36.104|Info|PlaybackService.SavePlaybackCountersAsync|539|Saved track statistics
2018-04-29 20:31:37.650|Error|App.xaml.ExecuteEmergencyStop|501|Unhandled Exception. Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
   at Dopamine.ViewModels.Common.LyricsViewModel.<.ctor>b__63_6()
   at MS.Internal.Commands.CommandHelpers.CanExecuteCommandSource(ICommandSource commandSource)
   at System.Windows.Controls.MenuItem.UpdateCanExecute()
   at System.Windows.Controls.MenuItem.OnCommandChanged(ICommand oldCommand, ICommand newCommand)
   at System.Windows.Controls.MenuItem.OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
   at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.Activate(Object item)
   at System.Windows.Data.BindingExpression.OnDataContextChanged(DependencyObject contextElement)
   at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpressionBase.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.TreeWalkHelper.OnInheritablePropertyChanged(DependencyObject d, InheritablePropertyChangeInfo info, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
   at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
   at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
   at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
   at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.ClrBindingWorker.NewValueAvailable(Boolean dependencySourcesChanged, Boolean initialValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.PropertyPathWorker.OnDependencyPropertyChanged(DependencyObject d, DependencyProperty dp, Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpressionBase.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.CoerceValue(DependencyProperty dp)
   at System.Windows.Controls.PopupControlService.OnOwnerChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   at System.Windows.Controls.PopupControlService.RaiseContextMenuOpeningEvent(IInputElement source, Double x, Double y, Boolean userInitiated)
   at System.Windows.Controls.PopupControlService.ProcessMouseUp(Object sender, MouseButtonEventArgs e)
   at System.Windows.Controls.PopupControlService.OnPostProcessInput(Object sender, ProcessInputEventArgs e)
   at System.Windows.Input.InputManager.RaiseProcessInputEventHandlers(ProcessInputEventHandler postProcessInput, ProcessInputEventArgs processInputEventArgs)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

Stack trace:
   at Dopamine.ViewModels.Common.LyricsViewModel.<.ctor>b__63_6()
   at MS.Internal.Commands.CommandHelpers.CanExecuteCommandSource(ICommandSource commandSource)
   at System.Windows.Controls.MenuItem.UpdateCanExecute()
   at System.Windows.Controls.MenuItem.OnCommandChanged(ICommand oldCommand, ICommand newCommand)
   at System.Windows.Controls.MenuItem.OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
   at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.Activate(Object item)
   at System.Windows.Data.BindingExpression.OnDataContextChanged(DependencyObject contextElement)
   at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpressionBase.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.TreeWalkHelper.OnInheritablePropertyChanged(DependencyObject d, InheritablePropertyChangeInfo info, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
   at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
   at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
   at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
   at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.ClrBindingWorker.NewValueAvailable(Boolean dependencySourcesChanged, Boolean initialValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.PropertyPathWorker.OnDependencyPropertyChanged(DependencyObject d, DependencyProperty dp, Boolean isASubPropertyChange)
   at System.Windows.Data.BindingExpression.HandlePropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpressionBase.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.Data.BindingExpression.OnPropertyInvalidation(DependencyObject d, DependencyPropertyChangedEventArgs args)
   at System.Windows.DependentList.InvalidateDependents(DependencyObject source, DependencyPropertyChangedEventArgs sourceArgs)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.CoerceValue(DependencyProperty dp)
   at System.Windows.Controls.PopupControlService.OnOwnerChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   at System.Windows.Controls.PopupControlService.RaiseContextMenuOpeningEvent(IInputElement source, Double x, Double y, Boolean userInitiated)
   at System.Windows.Controls.PopupControlService.ProcessMouseUp(Object sender, MouseButtonEventArgs e)
   at System.Windows.Controls.PopupControlService.OnPostProcessInput(Object sender, ProcessInputEventArgs e)
   at System.Windows.Input.InputManager.RaiseProcessInputEventHandlers(ProcessInputEventHandler postProcessInput, ProcessInputEventArgs processInputEventArgs)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

2018-04-29 20:31:37.650|Info|App.xaml.ExecuteEmergencyStop|504|### FORCED STOP of Dopamine, version 1.5.14.3001 ###
2018-04-29 20:31:37.723|Info|Shell.xaml.PerformClosingTasksAsync|146|Performing closing tasks
2018-04-29 20:31:37.724|Info|Shell.xaml.PerformClosingTasksAsync|151|Writing settings

that would have been an attachment but apparently I couldn't attach .txt

Download lyrics from options are greyed out. I can't select or deselect anything.   Deleting the settings.xml fixed that...annoying.

 

... {after lots of edits}  Looks like if I right click on the lyrics screen too fast after startup it crashes.  Also the file has to have no lyrics in it.

7 hours ago, Ned said:

Download lyrics from options are greyed out. I can't select or deselect anything.   Deleting the settings.xml fixed that...annoying.

 

... {after lots of edits}  Looks like if I right click on the lyrics screen too fast after startup it crashes.  Also the file has to have no lyrics in it.

Hi,

Thanks a lot for trying this out! I realized that testing on my computer doesn't make me discover all possible issues. That's why I re-introduced beta's.

I just fixed all issues you mentioned. Sorry for having them in the first place.

As for the lyrics not being found for "Untitled track", I suspect that the title "Untitled" causes the issue. I'm not sure yet. For other tracks NetEase support works fine.

 

Edit: another question: is the white line issue for timed lyrics resolved on your side?

I just want to say - if I haven't already - this is incredible. I've been using this as my main player since its release and it works brilliantly for me. @Raphaël G.I'm astonished at the work that you continue to put in to this program, and given it was a hobby to begin with I think we can all look to you as a great example of what can be achieved when we put our minds to something that interests us.

On 4/30/2018 at 4:10 PM, Nick H. said:

I just want to say - if I haven't already - this is incredible. I've been using this as my main player since its release and it works brilliantly for me. @Raphaël G.I'm astonished at the work that you continue to put in to this program, and given it was a hobby to begin with I think we can all look to you as a great example of what can be achieved when we put our minds to something that interests us.

Hi @Nick H., thanks a lot for the kind words. This kind of feedback means a lot to me, and is partly what keeps the project going. The other part comes from my inexhaustible need to learn new stuff, to learn better ways to program and to support users. It's challenging, but I need this, apparently :).

  • 2 weeks later...

Dopamine 1.5.14 has been released. This is the change log:

 

– [Changed] Updated the Chinese (Simplified) translation
– [Changed] Updated the Korean translation
– [Changed] Updated the Swedish translation
– [Changed] Decreased the minimum window size for people using narrow or vertical monitors
– [Changed] Before adding a collection folder, a check is now performed to ensure its content is accessible.
– [Changed] Improved parsing of lyrics
– [Fixed] We now don’t crash anymore when a collection folder’s content is not accessible.
– [Fixed] Indexing stops when encountering an unreadable file or folder
– [Fixed] Fixed another issue playing files which contain special characters
– [Fixed] Fixed multiple crashes when searching for lyrics and when editing lyrics
– [Fixed] Fixed a crash which occurs when indexing MP3 files which have corrupt headers
– [Fixed] Fixed a small issue displaying lyrics download timeout settings

 

Download here

  • 4 weeks later...
1 hour ago, FiB3R said:

Will this be fixed by then? 

 

 

?

Yes

 

Edit: however I want to add that the fix will be a workaround for user's which are, essentially, mixing up the artists and album artists tag. There is no AI to detect which tracks are from 1 album. It has to happen based on tag values. Dopamine 1 groups tracks which have the same Album artist and album title. Dopamine 2 will group all tracks which have the same album title. So, I can see the next complaint I'll get: why are tracks from 2 albums which have the same album title grouped into 1 album?

14 minutes ago, dakn said:

Yep exactly. You're putting in a fix that isn't required because someone can't tag their artists properly! (Don't do it ;))

 

People that have albums titled "Greatest Hits" Won't be happy!

I've long postponed "fixing" this, as the current behavior is the only correct one. But the amount of complaints and questions I get about the current behavior is just exhausting. I've spent already too much time explaining this. So the behavior change will happen, for the sake of my mental health :) I'm still brainstorming how I can make this optional though. As I smell trouble already.

8 minutes ago, Brandon H said:

looking good Raphael

 

any chance of you publishing an entry on the Window Store now that they allow WIN32 x86/x64 entries?

the extra level of sandboxing would be nice; even for an audio player :)

I can't say for sure. I've attempted publishing Dopamine to the store already, but the process is tiresome and includes contact with a Microsoft support engineer. I abandoned it after a few weeks. Maybe I'll try again in the future. Hopefully the process of adding a win32 app to the store will be more streamlined by then.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Posts

    • inb4 someone leaves the usual "what an unfortunate name" comment
    • Cuktech 10 Ultra charger review: big display, four ports, 110W total power by Taras Buria Cuktech recently announced a couple of Ultra-branded chargers, including a desktop 300W charger, which I reviewed a few weeks ago. For those who do need that much (or who do not want to spend that much on a charger), Cuktech also offers the 10 Ultra, a traditional wall charger with similar features. Four ports, a big display, and up to 110W of power output. After using it for a few weeks, here are my impressions. Disclaimer: Cuktech provided the review unit without any editorial input or pre-approval. Like the 30 Ultra, the 10 Ultra arrived in a box made of nice cardboard with quality print all over it. Inside, besides the charger, you will find a 240W 6A charger, which, this time, is fully braided. While Cuktech always bundles high-power cables with its chargers and power banks, they are usually regular and unassuming. This time, the cable is much nicer, matching the charger's $59.99 price tag. The charger itself measures 67 x 76 x 33 mm or 2.6 x 3.0 x 1.3 inches and weighs about 250 grams. Considering the charger has four ports and a big display, I would say the compact size is quite impressive, albeit a little hefty. The overall design is similar to other chargers from the manufacturer, minus the chrome Cuktech logo next to the four ports. The Cuktech 10 Ultra has retractable prongs for better portability. Its front side is covered with piano black plastic housing two elements: a capacitive button with backlight and a quite large display for various charging stats. Ports are downward-facing, and I have mixed feelings about such a design. It is not the most convenient when you frequently connect and disconnect cables. It makes you bend over to find the right port to connect, and it is a no-go with outlets mounted closer to the floor. On the bright side, design like this eliminates clutter and sagging, especially when using four cables at once. Plus, you get plenty of space for a big display. Ports include two high-speed USB Type-C ports, one Type-C for less demanding devices, and one classic USB Type-A. The first two ports deliver full 100W, while the third is capped at 45W. As for the Type-A port, its maximum output is 18W. In total, the charger delivers 110W of power, but in my testing, I managed to squeeze 117W when charging two power banks and a tablet. Quite impressive. Type-C1 Type-C2 Type-C3 Type-A Single-port 100W 100W 45W 18W Two ports 80W 20W - - Three ports 65W 20W 20W - Four ports 65W 20W 10W 10W The charger can detect handshake protocols and balance power across all four ports according to each device's needs. As such, power is not limited to the values in the table above. You can have two ports charging at 55W, three ports at 45W + 20W, and more. For some reason, Cuktech is not listing the supported protocols, but a quick test showed that it is compatible with PD3.0, PPS, QC5, DCP, and UFCS. When you connect a compatible device, the charger automatically detects its charging standard and displays it on the screen, for example, Apple 6A or Samsung 3A. Speaking of the screen. The main highlight of the 10 Ultra is its 1.57-inch display with a maximum brightness of 700 nits and 160-degree viewing angles. The display takes up most of the front, and it shows various charging-related information, including total output power, current temperature, power distribution across ports with watts, volts, and amps, a screensaver, and more. You can toggle between the different views by tapping the button, and holding it changes the screen orientation (portrait or horizontal, plus flipped) according to your socket position. The screen is very nice. It is sharp, vivid, and the fonts are easy to read. As for settings, you can change the following: Keep the screen on or off Lock the screen orientation (hold the button to change the screen orientation) Keep the USB Type-A port on Toggle power modes The charger has three power modes: AI: standard mode that automatically allocates power to each connected device. Power Priority: prioritizes power for high-demand devices, such as laptops or power banks. Balanced: splits power evenly across connected devices according to their needs I was skeptical at first, but after testing a few devices in different modes, I can see the benefit of these three modes. The most useful is power priority, which gives the first Type-C port more power. When I was charging a 100W power bank (port 1) alongside a 140W power bank (port 2), Power Priority split the total output about 75-30. Balanced mode, as the name suggests, splits the total output between the two ports more or less equally. As for AI mode, the charger uses its brain to detect which device needs more power. In my testing, it figured out that the 140W power needs a bit more juice. As I said, I expected this to be more of a gimmick, but the three built-in modes turned out quite useful. For example, you can prioritize your laptop while giving other ports a little less power, but still enough to charge at acceptable speeds. Unfortunately, unlike the 30 Ultra, this charger cannot display the battery level of the device being charged. This small feature turned out to be very useful when I was testing the 30 Ultra, as it allowed me to see my phone's battery level without picking it up. Like other Cuktech chargers I tested, the 10 Ultra one proved itself reliable and well-made. It uses Gallium nitride semiconductor technology to reduce the charger's size and improve efficiency. It is also better at dissipating heat, but I have to say that when charging two power banks at 117W total, the charger got hotter than what I would call comfortable (hold it for a few seconds, and you start feeling a burning sensation at your fingertips). However, the built-in thermal indicator remained below the temperature threshold, with the screen reassuring that the device operated at "High performance" (I tested it in a 21 °C / 69 °F room). Overall, the Cuktech 10 Ultra is a solid choice. If you need four ports and you like to nerd out on various stats, it is a very easy recommendation. It will take care of your laptop, phone, tablet, and power bank without breaking a sweat, plus the build, material, and cable quality are top-notch. The mode switcher is handy when charging different devices with different power needs, too. I cannot say a display is a must-have in a charger, especially when it makes you more conscious about where to plug it, but it is a neat addition if you have a socket at your table or bed level, so that you can actually use the display and its features. The more important fact is that despite its size and quality, the display does not make the charger that much more expensive than similarly powerful chargers from competitors. Plus, you can save 10% on the 10 Ultra with a promo code on Amazon. Buy Cuktech 10 Ultra charger - $53.99 on Amazon with a promo code As an Amazon Associate, we earn from qualifying purchases.
    • Last week I was investigating an issue with contacts and tried using the new Outlook. In the real (Classic) Outlook, you can easily go to any Outlook folder and present it in a Table View, then customize the columns to show/sort any field, which was exactly what I needed. But of course, the new Outlook doesn't have this feature at all. I gave up. Oh, and can we possibly stop claiming the new Outlook has PST support? What it really has is the ability to use the real Outlook in the background to pretend to have PST support. There is no PST support without the real Outlook installed.
    • Honestly just before Panos left it started to feel like MS just wasnt interested in them so they were being less innovative with them, and then when he DID leave for Amazon its kind of clear the direction is gone. It felt like Panos had both goals and drive, and a vision, but it felt like no matter what his title/department was the Surface devices never had the full interest of the rest of management and he was just pushing a bolder up a hill that MS was adding dirt to as he went.
    • A roguelike and a 4X strategy game are free to claim on the Epic Games Store by Pulasthi Ariyasinghe The final leg of the Epic Games Store's mystery giveaways promotion just landed, and it brought along two more games to keep. Last week's Lonestar and Calico giveaways have now been replaced with copies of Rogue Waters and Songs of Conquest to claim for PC gamers. As always, the game is yours to add permanently to your Epic Games Store library within the next seven days. Diving into the games, Songs of Conquest is developed by Lavapotion. This is a turn-based 4X strategy experience that has players making tough decisions and participating in tactical combat while also managing their kingdom. "Songs of Conquest is a turn-based strategy game inspired by 90s classics. Lead powerful magicians called Wielders and venture to lands unknown," explains the developer. "Wage battles against armies that dare oppose you, hunt for powerful artifacts and expand your territory. The world is ripe for the taking – seize it." Meanwhile, Rogue Waters comes from developer Ice Code Games. This rogue-lite experience has you taking the role of Captain Cutter as he commands his ship and crew through procedurally generated encounters. You'll be recruiting and training crew, use sea creatures, and battle with other ships and pirates. "Set sail as Captain Cutter, a pirate caught in a deadly struggle for power and vengeance," adds the developer. "Navigate dangerous waters, unleash mythical sea creatures, and outwit enemies as you chase legendary treasure and confront dark secrets." The newly available Rogue Waters and Songs of Conquest giveaways on the Epic Games Store are set to run until June 11, giving PC gamers seven days to claim the latest offer. Once this closes out, a new freebie will take its place on the same day, which is slated to be Warhammer 40K Speed Freeks. Don't forget that mobile gamers can check out the Epic Game Store's weekly giveaways on Android and iOS to grab a freebie there as well.
  • Recent Achievements

    • Conversation Starter
      mobandz earned a badge
      Conversation Starter
    • Apprentice
      fernan99 went up a rank
      Apprentice
    • One Month Later
      nothanks earned a badge
      One Month Later
    • One Month Later
      B2Proxy earned a badge
      One Month Later
    • One Year In
      MadMung0 earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      477
    2. 2
      PsYcHoKiLLa
      247
    3. 3
      Skyfrog
      79
    4. 4
      FloatingFatMan
      76
    5. 5
      Michael Scrip
      60
  • Tell a friend

    Love Neowin? Tell a friend!