Merge remote-tracking branch 'remotes/upstream/develop' into appveyorNewImage
This commit is contained in:
commit
9aa59a0d63
42 files changed
+1567
-261
No files matched your search
+2
-4
@@ -1,13 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||||
<add key="Vocaluxe" value="https://www.myget.org/F/vocaluxe/api/v2" />
|
|
||||||
</packageSources>
|
</packageSources>
|
||||||
<activePackageSource>
|
<activePackageSource>
|
||||||
<add key="Vocaluxe" value="https://www.myget.org/F/vocaluxe/api/v2" />
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||||
</activePackageSource>
|
</activePackageSource>
|
||||||
<disabledPackageSources>
|
<disabledPackageSources>
|
||||||
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
|
|
||||||
</disabledPackageSources>
|
</disabledPackageSources>
|
||||||
</configuration>
|
</configuration>
|
||||||
File renamed without changes.
@@ -0,0 +1,166 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<Info>
|
||||||
|
<Name>Genius Blue</Name>
|
||||||
|
<Folder>Genius</Folder>
|
||||||
|
<Author>Jiiniasu</Author>
|
||||||
|
</Info>
|
||||||
|
<!--Cover definitions when a category is missing a cover-->
|
||||||
|
<!--Possible types are: Default, Song, Artist, Letter, Edition, Genre, Language, Year, Decade, Date -->
|
||||||
|
<CoverGenerator Type="Default">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>550</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.855</R>
|
||||||
|
<G>0.937</G>
|
||||||
|
<B>0.945</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="24">
|
||||||
|
<Left>24</Left>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
<CoverGenerator Type="Year">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>550</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.855</R>
|
||||||
|
<G>0.937</G>
|
||||||
|
<B>0.945</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="24">
|
||||||
|
<Top>-150</Top>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
<CoverGenerator Type="Artist">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>550</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.855</R>
|
||||||
|
<G>0.937</G>
|
||||||
|
<B>0.945</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="24">
|
||||||
|
<Bottom>150</Bottom>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
<CoverGenerator Type="Date">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>120</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.855</R>
|
||||||
|
<G>0.937</G>
|
||||||
|
<B>0.945</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="5">
|
||||||
|
<Top>-150</Top>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
</root>
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<Info>
|
||||||
|
<Name>Genius Red</Name>
|
||||||
|
<Folder>Genius</Folder>
|
||||||
|
<Author>Jiiniasu</Author>
|
||||||
|
</Info>
|
||||||
|
<!--Cover definitions when a category is missing a cover-->
|
||||||
|
<!--Possible types are: Default, Song, Artist, Letter, Edition, Genre, Language, Year, Decade, Date -->
|
||||||
|
<CoverGenerator Type="Default">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>550</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.988</R>
|
||||||
|
<G>0.682</G>
|
||||||
|
<B>0.733</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="24">
|
||||||
|
<Left>24</Left>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
<CoverGenerator Type="Year">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>550</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.988</R>
|
||||||
|
<G>0.682</G>
|
||||||
|
<B>0.733</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="24">
|
||||||
|
<Top>-150</Top>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
<CoverGenerator Type="Artist">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>550</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.988</R>
|
||||||
|
<G>0.682</G>
|
||||||
|
<B>0.733</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="24">
|
||||||
|
<Bottom>150</Bottom>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
<CoverGenerator Type="Date">
|
||||||
|
<Text>
|
||||||
|
<!--<Text>: Text to be shown, %TEXT% will be replaced by the category or song name-->
|
||||||
|
<Text>%TEXT%</Text>
|
||||||
|
<Font>
|
||||||
|
<Name>Normal</Name>
|
||||||
|
<!--<Style>: Text style: Normal, Italic, Bold, BoldItalic-->
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<!--<Size> Maximum size of the text in px-->
|
||||||
|
<Size>120</Size>
|
||||||
|
</Font>
|
||||||
|
<!--<Color>: Text color from ColorScheme (high priority)-->
|
||||||
|
<!--or <R>, <G>, <B>, <A> (lower priority)-->
|
||||||
|
<Color>
|
||||||
|
<R>0.988</R>
|
||||||
|
<G>0.682</G>
|
||||||
|
<B>0.733</B>
|
||||||
|
<A>0.8</A>
|
||||||
|
</Color>
|
||||||
|
<!--<Margin>: Spacing of the text from the borders of the image in px-->
|
||||||
|
<Margin Default="5">
|
||||||
|
<Top>-150</Top>
|
||||||
|
</Margin>
|
||||||
|
<!--<Indent>: Indentation of the text for multiple lines-->
|
||||||
|
<Indent>100</Indent>
|
||||||
|
</Text>
|
||||||
|
<BackgroundColor>
|
||||||
|
<R>1</R>
|
||||||
|
<G>1</G>
|
||||||
|
<B>1</B>
|
||||||
|
<A>1</A>
|
||||||
|
</BackgroundColor>
|
||||||
|
<!--<Image>: Background image for the cover-->
|
||||||
|
<Image>Cover.png</Image>
|
||||||
|
<!--<ImageAlpha>Alpha value of the image in case the first cover is shown(optional)-->
|
||||||
|
<ImageAlpha>1.0</ImageAlpha>
|
||||||
|
<!--<ShowFirstCover>Whether the first cover of a category should be shown(optional)-->
|
||||||
|
<ShowFirstCover>True</ShowFirstCover>
|
||||||
|
</CoverGenerator>
|
||||||
|
</root>
|
||||||
@@ -152,12 +152,21 @@
|
|||||||
<string name="TR_SCREENSONG_NUMSONGS">(%v songs)</string>
|
<string name="TR_SCREENSONG_NUMSONGS">(%v songs)</string>
|
||||||
<string name="TR_SCREENSONG_NUMSONG">(%v song)</string>
|
<string name="TR_SCREENSONG_NUMSONG">(%v song)</string>
|
||||||
<string name="TR_SCREENSONG_ARTIST_TITLE">%a - %t</string>
|
<string name="TR_SCREENSONG_ARTIST_TITLE">%a - %t</string>
|
||||||
|
<string name="TR_SCREENSONG_HELPMESSAGE">A-Z = Jump to the letter • F3 = Search • CTRL+R = Random selection • CTRL+S = Start medley • CTRL+# = Change song sorting • CTRL+T = Enable/Disable category view • Space = Open song options • ESC = Back to main menu</string>
|
||||||
|
<string name="TR_SCREENSONG_HELPMESSAGESEARCH">A-Z = Search artist and title, prefixes for the search → a: = artist • t: = title • c: = creator • e: = edition • g: = genre • y: = year (e.g. 1999 or 1980-1989) • l: = language • al: = album • fi: = file name • fo: = folder name</string>
|
||||||
|
<string name="TR_SCREENSONG_HELPMESSAGEPARTY">1-6 = Press your team number to use a random song joker</string>
|
||||||
|
<string name="TR_SCREENSONG_SORTING">Sorting: %s</string>
|
||||||
|
<string name="TR_SCREENSONG_NOMEDLEY">No Medley for this song!</string>
|
||||||
<string name="TR_SCREENSING_PAUSE">Pause</string>
|
<string name="TR_SCREENSING_PAUSE">Pause</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_CANCEL">Stop singing</string>
|
<string name="TR_SCREENSING_BUTTON_CANCEL">Stop singing</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_CONTINUE">Continue</string>
|
<string name="TR_SCREENSING_BUTTON_CONTINUE">Continue</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_SKIP">Skip this song</string>
|
<string name="TR_SCREENSING_BUTTON_SKIP">Skip this song</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_RESTART_ROUND">Restart round</string>
|
<string name="TR_SCREENSING_BUTTON_RESTART_ROUND">Restart round</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_RESTART_GAME">Restart game</string>
|
<string name="TR_SCREENSING_BUTTON_RESTART_GAME">Restart game</string>
|
||||||
|
<string name="TR_SCREENSING_NOMORESONGS">No more songs in playlist!</string>
|
||||||
|
<string name="TR_SCREENSING_NOWEBCAM">No webcam available!</string>
|
||||||
|
<string name="TR_SCREENSING_ASPECTRATIO">Aspect Ratio: %a</string>
|
||||||
|
<string name="TR_SCREENSING_SKIPPEDSECONDS">Skipped %s seconds</string>
|
||||||
<string name="TR_SCREENSCORE_SCORES">Scores</string>
|
<string name="TR_SCREENSCORE_SCORES">Scores</string>
|
||||||
<string name="TR_SCREENSCORE_RATING">Rating</string>
|
<string name="TR_SCREENSCORE_RATING">Rating</string>
|
||||||
<string name="TR_SCREENSCORE_POINTS">Points</string>
|
<string name="TR_SCREENSCORE_POINTS">Points</string>
|
||||||
|
|||||||
@@ -147,10 +147,19 @@
|
|||||||
<string name="TR_SCREENSONG_NUMSONGS">(%v Lieder)</string>
|
<string name="TR_SCREENSONG_NUMSONGS">(%v Lieder)</string>
|
||||||
<string name="TR_SCREENSONG_NUMSONG">(%v Lied)</string>
|
<string name="TR_SCREENSONG_NUMSONG">(%v Lied)</string>
|
||||||
<string name="TR_SCREENSONG_ARTIST_TITLE">%a -%t</string>
|
<string name="TR_SCREENSONG_ARTIST_TITLE">%a -%t</string>
|
||||||
|
<string name="TR_SCREENSONG_HELPMESSAGE">A-Z = Zum Buchstaben springen • F3 = Suchen • STRG+R = Zufällige Auswahl • STRG+S = Starte Medley • STRG+# = Song Sortierung ändern • STRG+T = Kategorieansicht ein-/ausschalten • Leertaste = Lied-Optionen öffnen • ESC = Zurück zum Hauptmenü</string>
|
||||||
|
<string name="TR_SCREENSONG_HELPMESSAGESEARCH">A-Z = Interpreten und Titel durchsuchen, Präfixe für die Suche → a: = Interpret • t: = Titel • c: = Ersteller • e: = Edition • g: = Genre • y: = Jahr (z.B. 1999 oder 1980-1989) • l: = Sprache • al: = Album • fi: = Dateiname • fo: = Ordnername</string>
|
||||||
|
<string name="TR_SCREENSONG_HELPMESSAGEPARTY">1-6 = Drücke die Teamnummer um einen Zufallssong Joker zu verwenden</string>
|
||||||
|
<string name="TR_SCREENSONG_SORTING">Sortierung: %s</string>
|
||||||
|
<string name="TR_SCREENSONG_NOMEDLEY">Kein Medley für diesen Song!</string>
|
||||||
<string name="TR_SCREENSING_PAUSE">Pause</string>
|
<string name="TR_SCREENSING_PAUSE">Pause</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_CANCEL">Lied beenden</string>
|
<string name="TR_SCREENSING_BUTTON_CANCEL">Lied beenden</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_CONTINUE">Fortfahren</string>
|
<string name="TR_SCREENSING_BUTTON_CONTINUE">Fortfahren</string>
|
||||||
<string name="TR_SCREENSING_BUTTON_SKIP">Lied überspringen</string>
|
<string name="TR_SCREENSING_BUTTON_SKIP">Lied überspringen</string>
|
||||||
|
<string name="TR_SCREENSING_NOMORESONGS">Keine weiteren Songs in der Playlist!</string>
|
||||||
|
<string name="TR_SCREENSING_NOWEBCAM">Keine Webcam verfügbar!</string>
|
||||||
|
<string name="TR_SCREENSING_ASPECTRATIO">Seitenverhältnis: %a</string>
|
||||||
|
<string name="TR_SCREENSING_SKIPPEDSECONDS">%s Sekunden gesprungen</string>
|
||||||
<string name="TR_SCREENSCORE_SCORES">Auswertung</string>
|
<string name="TR_SCREENSCORE_SCORES">Auswertung</string>
|
||||||
<string name="TR_SCREENSCORE_RATING">Bewertung</string>
|
<string name="TR_SCREENSCORE_RATING">Bewertung</string>
|
||||||
<string name="TR_SCREENSCORE_POINTS">Punkte</string>
|
<string name="TR_SCREENSCORE_POINTS">Punkte</string>
|
||||||
|
|||||||
+12
-1
@@ -132,12 +132,20 @@ Song screen
|
|||||||
[F3] to open/close the song search menu
|
[F3] to open/close the song search menu
|
||||||
[SPACE] to open/close the song menu
|
[SPACE] to open/close the song menu
|
||||||
[TAB] to switch selection of song menu and playlist (if opened)
|
[TAB] to switch selection of song menu and playlist (if opened)
|
||||||
|
[CTRL] + [H] to show the highscore of the selected song
|
||||||
|
[CTRL] + [T] to toggle category / tabs view
|
||||||
|
[CTRL] + [1]..[0] to change the song sorting (just changed for runtime, not saved!), in order from keys 1 to 0:
|
||||||
|
folder, artist, artist by letter, title by letter, edition, genre, language, year, decade, date added
|
||||||
[CTRL] + [R] to select a random song
|
[CTRL] + [R] to select a random song
|
||||||
[CTRL] + [A] to sing all songs
|
[CTRL] + [A] to sing all songs
|
||||||
[CTRL] + [S] to sing current song in medley version
|
[CTRL] + [S] to sing current song in medley version
|
||||||
[CTRL] + [V] to sing all songs from a category
|
[CTRL] + [V] to sing all songs from a category
|
||||||
|
[CTRL] + [L] to filter the song list to the current displayed playlist. Press again to remove this filter.
|
||||||
[NUM_1]..[NUM_6] to use a Joker for team 1..6
|
[NUM_1]..[NUM_6] to use a Joker for team 1..6
|
||||||
[A]..[Z] to jump to category/song title starting with that letter
|
[A]..[Z] to jump to category/song title starting with that letters (multiple letters possible)
|
||||||
|
[PAGE UP] or [PAGE DOWN] to scroll one page up/down
|
||||||
|
[CTRL] + [PAGE UP or DOWN] to go inside next or previous category while being in a category
|
||||||
|
[HOME] or [END] to scroll up to first song or down to last song
|
||||||
|
|
||||||
Name selection screen
|
Name selection screen
|
||||||
[1]..[6] to activate player selection.
|
[1]..[6] to activate player selection.
|
||||||
@@ -149,6 +157,8 @@ Name selection screen
|
|||||||
Sing screen
|
Sing screen
|
||||||
[P] to toggle pause.
|
[P] to toggle pause.
|
||||||
[CTRL] + [S] to skip a song if there is another one in the playlist.
|
[CTRL] + [S] to skip a song if there is another one in the playlist.
|
||||||
|
[SHIFT] + [RIGHT] to skip 10 seconds within the playing song (not in party modes).
|
||||||
|
[CTRL] + [RIGHT] to skip 30 seconds within the playing song (not in party modes).
|
||||||
[T] to change the time format of the timer.
|
[T] to change the time format of the timer.
|
||||||
[I] to change view of player information.
|
[I] to change view of player information.
|
||||||
[W] to activate the configured webcam.
|
[W] to activate the configured webcam.
|
||||||
@@ -156,6 +166,7 @@ Sing screen
|
|||||||
|
|
||||||
Score and highscore screen
|
Score and highscore screen
|
||||||
[LEFT] or [RIGHT] to show (high)scores of another round (if there is more than one)
|
[LEFT] or [RIGHT] to show (high)scores of another round (if there is more than one)
|
||||||
|
if opened from song list screen: Switch between game modes (Normal, Medley, Duet, Short)
|
||||||
|
|
||||||
|
|
||||||
=================================
|
=================================
|
||||||
|
|||||||
@@ -1,5 +1,37 @@
|
|||||||
ScreenSong
|
ScreenSong
|
||||||
|
|
||||||
|
++++++++++
|
||||||
|
Version 10:
|
||||||
|
|
||||||
|
Add:
|
||||||
|
<ButtonPlaylistList>
|
||||||
|
|
||||||
|
++++++++++
|
||||||
|
Version 9:
|
||||||
|
|
||||||
|
Add:
|
||||||
|
<TextSongYear>
|
||||||
|
|
||||||
|
Changed values at:
|
||||||
|
<TextSongLength>
|
||||||
|
|
||||||
|
++++++++++
|
||||||
|
Version 8:
|
||||||
|
|
||||||
|
Add:
|
||||||
|
<ButtonOptionsHighscore> to SongMenu
|
||||||
|
<TextShortInfoTop>
|
||||||
|
<StaticShortInfoTop>
|
||||||
|
|
||||||
|
++++++++++
|
||||||
|
Version 7:
|
||||||
|
|
||||||
|
Add:
|
||||||
|
<TextHelpBar>
|
||||||
|
<TextHelpBarSearch>
|
||||||
|
<TextHelpBarParty>
|
||||||
|
Shows key shortcut and search usage as small text line at the bottom of the screen.
|
||||||
|
|
||||||
++++++++++
|
++++++++++
|
||||||
Version 6:
|
Version 6:
|
||||||
|
|
||||||
|
|||||||
@@ -353,6 +353,7 @@
|
|||||||
<DeleteIcon>DeleteIcon.png</DeleteIcon>
|
<DeleteIcon>DeleteIcon.png</DeleteIcon>
|
||||||
<SaveIcon>SaveIcon.png</SaveIcon>
|
<SaveIcon>SaveIcon.png</SaveIcon>
|
||||||
<SingIcon>SingIcon.png</SingIcon>
|
<SingIcon>SingIcon.png</SingIcon>
|
||||||
|
<ListIcon>ListIcon.png</ListIcon>
|
||||||
<Minus>MinusIcon.png</Minus>
|
<Minus>MinusIcon.png</Minus>
|
||||||
<Plus>PlusIcon.png</Plus>
|
<Plus>PlusIcon.png</Plus>
|
||||||
<VolUp>VolUp.png</VolUp>
|
<VolUp>VolUp.png</VolUp>
|
||||||
|
|||||||
@@ -353,6 +353,7 @@
|
|||||||
<DeleteIcon>DeleteIcon.png</DeleteIcon>
|
<DeleteIcon>DeleteIcon.png</DeleteIcon>
|
||||||
<SaveIcon>SaveIcon.png</SaveIcon>
|
<SaveIcon>SaveIcon.png</SaveIcon>
|
||||||
<SingIcon>SingIcon.png</SingIcon>
|
<SingIcon>SingIcon.png</SingIcon>
|
||||||
|
<ListIcon>ListIcon.png</ListIcon>
|
||||||
<Minus>MinusIcon.png</Minus>
|
<Minus>MinusIcon.png</Minus>
|
||||||
<Plus>PlusIcon.png</Plus>
|
<Plus>PlusIcon.png</Plus>
|
||||||
<VolUp>VolUp.png</VolUp>
|
<VolUp>VolUp.png</VolUp>
|
||||||
|
|||||||
@@ -353,6 +353,7 @@
|
|||||||
<DeleteIcon>DeleteIcon.png</DeleteIcon>
|
<DeleteIcon>DeleteIcon.png</DeleteIcon>
|
||||||
<SaveIcon>SaveIcon.png</SaveIcon>
|
<SaveIcon>SaveIcon.png</SaveIcon>
|
||||||
<SingIcon>SingIcon.png</SingIcon>
|
<SingIcon>SingIcon.png</SingIcon>
|
||||||
|
<ListIcon>ListIcon.png</ListIcon>
|
||||||
<Minus>MinusIcon.png</Minus>
|
<Minus>MinusIcon.png</Minus>
|
||||||
<Plus>PlusIcon.png</Plus>
|
<Plus>PlusIcon.png</Plus>
|
||||||
<VolUp>VolUp.png</VolUp>
|
<VolUp>VolUp.png</VolUp>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 720 B |
@@ -2,7 +2,7 @@
|
|||||||
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Informations>
|
<Informations>
|
||||||
<ScreenName>ScreenSing</ScreenName>
|
<ScreenName>ScreenSing</ScreenName>
|
||||||
<ScreenVersion>9</ScreenVersion>
|
<ScreenVersion>10</ScreenVersion>
|
||||||
</Informations>
|
</Informations>
|
||||||
<Backgrounds>
|
<Backgrounds>
|
||||||
<Background Name="Background1">
|
<Background Name="Background1">
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
<Color Name="BackgroundColorAlpha" />
|
<Color Name="BackgroundColorAlpha" />
|
||||||
<Rect>
|
<Rect>
|
||||||
<X>0</X>
|
<X>0</X>
|
||||||
<Y>0</Y>
|
<Y>610</Y>
|
||||||
<W>1280</W>
|
<W>1280</W>
|
||||||
<H>90</H>
|
<H>90</H>
|
||||||
<Z>-0.75</Z>
|
<Z>-0.75</Z>
|
||||||
@@ -136,7 +136,7 @@
|
|||||||
<Color Name="LyricHelperDuet" />
|
<Color Name="LyricHelperDuet" />
|
||||||
<Rect>
|
<Rect>
|
||||||
<X>40</X>
|
<X>40</X>
|
||||||
<Y>10</Y>
|
<Y>623</Y>
|
||||||
<W>45</W>
|
<W>45</W>
|
||||||
<H>36</H>
|
<H>36</H>
|
||||||
<Z>-1</Z>
|
<Z>-1</Z>
|
||||||
@@ -627,8 +627,33 @@
|
|||||||
<Z>-0.75</Z>
|
<Z>-0.75</Z>
|
||||||
</Rect>
|
</Rect>
|
||||||
</Static>
|
</Static>
|
||||||
|
<Static Name="StaticShortInfoTop">
|
||||||
|
<Skin />
|
||||||
|
<Color Name="BackgroundColorAlpha" />
|
||||||
|
<Rect>
|
||||||
|
<X>980</X>
|
||||||
|
<Y>0</Y>
|
||||||
|
<W>300</W>
|
||||||
|
<H>30</H>
|
||||||
|
<Z>-0.75</Z>
|
||||||
|
</Rect>
|
||||||
|
</Static>
|
||||||
</Statics>
|
</Statics>
|
||||||
<Texts>
|
<Texts>
|
||||||
|
<Text Name="TextShortInfoTop">
|
||||||
|
<X>1130</X>
|
||||||
|
<Y>2</Y>
|
||||||
|
<Z>-3</Z>
|
||||||
|
<H>25</H>
|
||||||
|
<MaxW>280</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Center</Align>
|
||||||
|
<ResizeAlign>Center</ResizeAlign>
|
||||||
|
<Style>Normal</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text />
|
||||||
|
</Text>
|
||||||
<Text Name="TextSongName">
|
<Text Name="TextSongName">
|
||||||
<X>640</X>
|
<X>640</X>
|
||||||
<Y>10</Y>
|
<Y>10</Y>
|
||||||
@@ -1501,7 +1526,7 @@
|
|||||||
<Lyric Name="LyricMainDuet">
|
<Lyric Name="LyricMainDuet">
|
||||||
<Rect>
|
<Rect>
|
||||||
<X>637</X>
|
<X>637</X>
|
||||||
<Y>7</Y>
|
<Y>620</Y>
|
||||||
<W>1200</W>
|
<W>1200</W>
|
||||||
<H>42</H>
|
<H>42</H>
|
||||||
<Z>-1</Z>
|
<Z>-1</Z>
|
||||||
@@ -1512,7 +1537,7 @@
|
|||||||
<Lyric Name="LyricSubDuet">
|
<Lyric Name="LyricSubDuet">
|
||||||
<Rect>
|
<Rect>
|
||||||
<X>637</X>
|
<X>637</X>
|
||||||
<Y>48</Y>
|
<Y>662</Y>
|
||||||
<W>1200</W>
|
<W>1200</W>
|
||||||
<H>35</H>
|
<H>35</H>
|
||||||
<Z>-1</Z>
|
<Z>-1</Z>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
<Informations>
|
<Informations>
|
||||||
<ScreenName>ScreenSong</ScreenName>
|
<ScreenName>ScreenSong</ScreenName>
|
||||||
<ScreenVersion>6</ScreenVersion>
|
<ScreenVersion>10</ScreenVersion>
|
||||||
</Informations>
|
</Informations>
|
||||||
<Backgrounds>
|
<Backgrounds>
|
||||||
<Background Name="Background1">
|
<Background Name="Background1">
|
||||||
@@ -70,8 +70,33 @@
|
|||||||
<Z>-2.1</Z>
|
<Z>-2.1</Z>
|
||||||
</Rect>
|
</Rect>
|
||||||
</Static>
|
</Static>
|
||||||
|
<Static Name="StaticShortInfoTop">
|
||||||
|
<Skin />
|
||||||
|
<Color Name="BackgroundColorAlpha" />
|
||||||
|
<Rect>
|
||||||
|
<X>490</X>
|
||||||
|
<Y>0</Y>
|
||||||
|
<W>300</W>
|
||||||
|
<H>30</H>
|
||||||
|
<Z>-0.75</Z>
|
||||||
|
</Rect>
|
||||||
|
</Static>
|
||||||
</Statics>
|
</Statics>
|
||||||
<Texts>
|
<Texts>
|
||||||
|
<Text Name="TextShortInfoTop">
|
||||||
|
<X>640</X>
|
||||||
|
<Y>2</Y>
|
||||||
|
<Z>-1</Z>
|
||||||
|
<H>25</H>
|
||||||
|
<MaxW>280</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Center</Align>
|
||||||
|
<ResizeAlign>Center</ResizeAlign>
|
||||||
|
<Style>Normal</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text>TR_SCREENSONG_SORTING</Text>
|
||||||
|
</Text>
|
||||||
<Text Name="TextPlayer1">
|
<Text Name="TextPlayer1">
|
||||||
<X>950</X>
|
<X>950</X>
|
||||||
<Y>65</Y>
|
<Y>65</Y>
|
||||||
@@ -238,6 +263,48 @@
|
|||||||
<Font>Outline</Font>
|
<Font>Outline</Font>
|
||||||
<Text>TR_SCREENSONG_SONGOPTIONS</Text>
|
<Text>TR_SCREENSONG_SONGOPTIONS</Text>
|
||||||
</Text>
|
</Text>
|
||||||
|
<Text Name="TextHelpBar">
|
||||||
|
<X>40</X>
|
||||||
|
<Y>700</Y>
|
||||||
|
<Z>0</Z>
|
||||||
|
<H>16</H>
|
||||||
|
<MaxW>1200</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Left</Align>
|
||||||
|
<ResizeAlign>Bottom</ResizeAlign>
|
||||||
|
<Style>Normal</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text>TR_SCREENSONG_HELPMESSAGE</Text>
|
||||||
|
</Text>
|
||||||
|
<Text Name="TextHelpBarSearch">
|
||||||
|
<X>40</X>
|
||||||
|
<Y>700</Y>
|
||||||
|
<Z>0</Z>
|
||||||
|
<H>16</H>
|
||||||
|
<MaxW>1200</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Left</Align>
|
||||||
|
<ResizeAlign>Bottom</ResizeAlign>
|
||||||
|
<Style>Normal</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text>TR_SCREENSONG_HELPMESSAGESEARCH</Text>
|
||||||
|
</Text>
|
||||||
|
<Text Name="TextHelpBarParty">
|
||||||
|
<X>40</X>
|
||||||
|
<Y>700</Y>
|
||||||
|
<Z>0</Z>
|
||||||
|
<H>16</H>
|
||||||
|
<MaxW>1200</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Left</Align>
|
||||||
|
<ResizeAlign>Bottom</ResizeAlign>
|
||||||
|
<Style>Normal</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text>TR_SCREENSONG_HELPMESSAGEPARTY</Text>
|
||||||
|
</Text>
|
||||||
</Texts>
|
</Texts>
|
||||||
<Buttons>
|
<Buttons>
|
||||||
<Button Name="ButtonJoker1">
|
<Button Name="ButtonJoker1">
|
||||||
@@ -746,6 +813,33 @@
|
|||||||
<Text>TR_SCREENSONG_BUTTON_STARTMEDLEY</Text>
|
<Text>TR_SCREENSONG_BUTTON_STARTMEDLEY</Text>
|
||||||
</Text>
|
</Text>
|
||||||
</Button>
|
</Button>
|
||||||
|
<Button Name="ButtonOptionsHighscore">
|
||||||
|
<Skin>SongSelectButton</Skin>
|
||||||
|
<SkinSelected>SongSelectButton</SkinSelected>
|
||||||
|
<Rect>
|
||||||
|
<X>40</X>
|
||||||
|
<Y>290</Y>
|
||||||
|
<W>360</W>
|
||||||
|
<H>40</H>
|
||||||
|
<Z>-2.11</Z>
|
||||||
|
</Rect>
|
||||||
|
<Color Name="ButtonColor" />
|
||||||
|
<SelColor Name="ButtonSelColor" />
|
||||||
|
<Text Name="Text">
|
||||||
|
<X>180</X>
|
||||||
|
<Y>7</Y>
|
||||||
|
<Z>0</Z>
|
||||||
|
<H>25</H>
|
||||||
|
<MaxW>350</MaxW>
|
||||||
|
<Color Name="ButtonTextColor" />
|
||||||
|
<SelColor Name="ButtonTextSelColor" />
|
||||||
|
<Align>Center</Align>
|
||||||
|
<ResizeAlign>Center</ResizeAlign>
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text>TR_SCREENHIGHSCORE_HIGHSCORE</Text>
|
||||||
|
</Text>
|
||||||
|
</Button>
|
||||||
</Buttons>
|
</Buttons>
|
||||||
<SongMenus>
|
<SongMenus>
|
||||||
<SongMenu Name="SongMenu">
|
<SongMenu Name="SongMenu">
|
||||||
@@ -811,19 +905,33 @@
|
|||||||
<Text />
|
<Text />
|
||||||
</TextTitle>
|
</TextTitle>
|
||||||
<TextSongLength Name="TextSongLength">
|
<TextSongLength Name="TextSongLength">
|
||||||
<X>222</X>
|
<X>391</X>
|
||||||
<Y>490</Y>
|
<Y>490</Y>
|
||||||
<Z>-1.01</Z>
|
<Z>-1.01</Z>
|
||||||
<H>28</H>
|
<H>28</H>
|
||||||
<MaxW>340</MaxW>
|
<MaxW>100</MaxW>
|
||||||
<Color Name="TextColor" />
|
<Color Name="TextColor" />
|
||||||
<SelColor Name="TextSelColor" />
|
<SelColor Name="TextSelColor" />
|
||||||
<Align>Center</Align>
|
<Align>Right</Align>
|
||||||
<ResizeAlign>Top</ResizeAlign>
|
<ResizeAlign>Top</ResizeAlign>
|
||||||
<Style>Bold</Style>
|
<Style>Bold</Style>
|
||||||
<Font>Outline</Font>
|
<Font>Outline</Font>
|
||||||
<Text />
|
<Text />
|
||||||
</TextSongLength>
|
</TextSongLength>
|
||||||
|
<TextSongYear Name="TextSongYear">
|
||||||
|
<X>52</X>
|
||||||
|
<Y>490</Y>
|
||||||
|
<Z>-1.01</Z>
|
||||||
|
<H>28</H>
|
||||||
|
<MaxW>100</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Left</Align>
|
||||||
|
<ResizeAlign>Top</ResizeAlign>
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text />
|
||||||
|
</TextSongYear>
|
||||||
<StaticCoverBig Name="StaticCoverBig">
|
<StaticCoverBig Name="StaticCoverBig">
|
||||||
<Skin />
|
<Skin />
|
||||||
<Color Name="Visible" />
|
<Color Name="Visible" />
|
||||||
@@ -896,16 +1004,16 @@
|
|||||||
<SpaceW>10</SpaceW>
|
<SpaceW>10</SpaceW>
|
||||||
<SpaceH>10</SpaceH>
|
<SpaceH>10</SpaceH>
|
||||||
<TileRect>
|
<TileRect>
|
||||||
<X>375</X>
|
<X>410</X>
|
||||||
<Y>42</Y>
|
<Y>42</Y>
|
||||||
<W>850</W>
|
<W>830</W>
|
||||||
<H>555</H>
|
<H>555</H>
|
||||||
<Z>-1</Z>
|
<Z>-1</Z>
|
||||||
</TileRect>
|
</TileRect>
|
||||||
<TileRectSmall>
|
<TileRectSmall>
|
||||||
<X>375</X>
|
<X>410</X>
|
||||||
<Y>42</Y>
|
<Y>42</Y>
|
||||||
<W>450</W>
|
<W>410</W>
|
||||||
<H>550</H>
|
<H>550</H>
|
||||||
<Z>-1</Z>
|
<Z>-1</Z>
|
||||||
</TileRectSmall>
|
</TileRectSmall>
|
||||||
@@ -938,19 +1046,33 @@
|
|||||||
<Text />
|
<Text />
|
||||||
</TextTitle>
|
</TextTitle>
|
||||||
<TextSongLength Name="TextSongLength">
|
<TextSongLength Name="TextSongLength">
|
||||||
<X>222</X>
|
<X>391</X>
|
||||||
<Y>490</Y>
|
<Y>490</Y>
|
||||||
<Z>-1.01</Z>
|
<Z>-1.01</Z>
|
||||||
<H>28</H>
|
<H>28</H>
|
||||||
<MaxW>340</MaxW>
|
<MaxW>100</MaxW>
|
||||||
<Color Name="TextColor" />
|
<Color Name="TextColor" />
|
||||||
<SelColor Name="TextSelColor" />
|
<SelColor Name="TextSelColor" />
|
||||||
<Align>Center</Align>
|
<Align>Right</Align>
|
||||||
<ResizeAlign>Top</ResizeAlign>
|
<ResizeAlign>Top</ResizeAlign>
|
||||||
<Style>Bold</Style>
|
<Style>Bold</Style>
|
||||||
<Font>Outline</Font>
|
<Font>Outline</Font>
|
||||||
<Text />
|
<Text />
|
||||||
</TextSongLength>
|
</TextSongLength>
|
||||||
|
<TextSongYear Name="TextSongYear">
|
||||||
|
<X>52</X>
|
||||||
|
<Y>490</Y>
|
||||||
|
<Z>-1.01</Z>
|
||||||
|
<H>28</H>
|
||||||
|
<MaxW>100</MaxW>
|
||||||
|
<Color Name="TextColor" />
|
||||||
|
<SelColor Name="TextSelColor" />
|
||||||
|
<Align>Left</Align>
|
||||||
|
<ResizeAlign>Top</ResizeAlign>
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text />
|
||||||
|
</TextSongYear>
|
||||||
<StaticCoverBig Name="StaticCoverBig">
|
<StaticCoverBig Name="StaticCoverBig">
|
||||||
<Skin />
|
<Skin />
|
||||||
<Color Name="Visible" />
|
<Color Name="Visible" />
|
||||||
@@ -1338,6 +1460,33 @@
|
|||||||
<Text />
|
<Text />
|
||||||
</Text>
|
</Text>
|
||||||
</ButtonPlaylistSave>
|
</ButtonPlaylistSave>
|
||||||
|
<ButtonPlaylistList Name="ButtonPlaylistList">
|
||||||
|
<Skin>ListIcon</Skin>
|
||||||
|
<SkinSelected>ListIcon</SkinSelected>
|
||||||
|
<Rect>
|
||||||
|
<X>1120</X>
|
||||||
|
<Y>548</Y>
|
||||||
|
<W>35</W>
|
||||||
|
<H>35</H>
|
||||||
|
<Z>-1.01</Z>
|
||||||
|
</Rect>
|
||||||
|
<Color Name="ButtonColor" />
|
||||||
|
<SelColor Name="ButtonSelColor" />
|
||||||
|
<Text Name="Text">
|
||||||
|
<X>180</X>
|
||||||
|
<Y>5</Y>
|
||||||
|
<Z>0</Z>
|
||||||
|
<H>25</H>
|
||||||
|
<MaxW>350</MaxW>
|
||||||
|
<Color Name="ButtonTextColor" />
|
||||||
|
<SelColor Name="ButtonTextSelColor" />
|
||||||
|
<Align>Center</Align>
|
||||||
|
<ResizeAlign>Center</ResizeAlign>
|
||||||
|
<Style>Bold</Style>
|
||||||
|
<Font>Outline</Font>
|
||||||
|
<Text />
|
||||||
|
</Text>
|
||||||
|
</ButtonPlaylistList>
|
||||||
<ButtonPlaylistDelete Name="ButtonPlaylistDelete">
|
<ButtonPlaylistDelete Name="ButtonPlaylistDelete">
|
||||||
<Skin>DeleteIcon</Skin>
|
<Skin>DeleteIcon</Skin>
|
||||||
<SkinSelected>DeleteIcon</SkinSelected>
|
<SkinSelected>DeleteIcon</SkinSelected>
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
@@ -43,6 +44,7 @@
|
|||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
@@ -53,6 +55,7 @@
|
|||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -64,6 +67,7 @@
|
|||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
|
||||||
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -52,5 +52,4 @@ Vocaluxe Homepage: https://vocaluxe.org/
|
|||||||
GitHub Wiki: https://github.com/Vocaluxe/Vocaluxe/wiki
|
GitHub Wiki: https://github.com/Vocaluxe/Vocaluxe/wiki
|
||||||
GitHub Issues Tracker: https://github.com/Vocaluxe/Vocaluxe/issues
|
GitHub Issues Tracker: https://github.com/Vocaluxe/Vocaluxe/issues
|
||||||
Translations: https://www.transifex.com/projects/p/vocaluxe/
|
Translations: https://www.transifex.com/projects/p/vocaluxe/
|
||||||
Support Forum (German): http://www.ultra-star.de
|
|
||||||
Song-Database (USDB): http://usdb.animux.de/
|
Song-Database (USDB): http://usdb.animux.de/
|
||||||
@@ -316,14 +316,13 @@ namespace Vocaluxe.Base
|
|||||||
CSound.SetGlobalVolume(CConfig.PreviewMusicVolume);
|
CSound.SetGlobalVolume(CConfig.PreviewMusicVolume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Change song position only if song is changed or near to end
|
||||||
bool songChanged = _CurPlayer.SongID != song.ID;
|
bool songChanged = _CurPlayer.SongID != song.ID;
|
||||||
|
if (!songChanged && _CurPlayer.Position + 30 < _CurPlayer.Length)
|
||||||
|
return;
|
||||||
|
|
||||||
_PreviewPlayer.Load(song);
|
_PreviewPlayer.Load(song);
|
||||||
|
|
||||||
|
|
||||||
//Change song position only if song is changed or near to end
|
|
||||||
if (songChanged || _CurPlayer.Position + 30 < _CurPlayer.Length || _PreviewStartHelperTask == null)
|
|
||||||
{
|
|
||||||
lock (_PreviewStartHelperTaskLock)
|
lock (_PreviewStartHelperTaskLock)
|
||||||
{
|
{
|
||||||
_PreviewStartHelperTask = new Task(() =>
|
_PreviewStartHelperTask = new Task(() =>
|
||||||
@@ -344,28 +343,6 @@ namespace Vocaluxe.Base
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
_CurPlayer = _PreviewPlayer;
|
_CurPlayer = _PreviewPlayer;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (_PreviewStartHelperTask != null)
|
|
||||||
{
|
|
||||||
lock (_PreviewStartHelperTaskLock)
|
|
||||||
{
|
|
||||||
// Recheck the condition as it cloud have change before we got the lock
|
|
||||||
if (_PreviewStartHelperTask != null)
|
|
||||||
{
|
|
||||||
_PreviewStartHelperTask = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_PreviewPlayer.Position = _CurPlayer.Position;
|
|
||||||
_CurPlayer = _PreviewPlayer;
|
|
||||||
Play();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StopPreview()
|
public static void StopPreview()
|
||||||
|
|||||||
@@ -688,7 +688,7 @@ namespace Vocaluxe.Base
|
|||||||
{
|
{
|
||||||
//Check if folder exists
|
//Check if folder exists
|
||||||
if (Directory.Exists(folder))
|
if (Directory.Exists(folder))
|
||||||
SongFolders.Add(folder);
|
SongFolders.Add(Path.GetFullPath(folder));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -715,7 +715,7 @@ namespace Vocaluxe.Base
|
|||||||
Regex spliterVal = new Regex(@"\s", RegexOptions.IgnoreCase);
|
Regex spliterVal = new Regex(@"\s", RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
//split arg with Spilter-Regex and save in parts
|
//split arg with Spilter-Regex and save in parts
|
||||||
string[] parts = spliterVal.Split(text, 2);
|
string[] parts = spliterVal.Split(text.Trim(), 2);
|
||||||
|
|
||||||
switch (parts.Length)
|
switch (parts.Length)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -133,6 +133,11 @@ namespace Vocaluxe.Base
|
|||||||
{
|
{
|
||||||
_UnloadCovers();
|
_UnloadCovers();
|
||||||
_LoadCovers();
|
_LoadCovers();
|
||||||
|
|
||||||
|
// Stefan1200: Added a workaround to fix issue #446, because switching the cover theme gets bugged on the song screen and needed a game restart.
|
||||||
|
// Toggle the tabs view fixes this bug somehow.
|
||||||
|
CSongs.Categorizer.Tabs = (CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_ON ? EOffOn.TR_CONFIG_OFF : EOffOn.TR_CONFIG_ON);
|
||||||
|
CSongs.Categorizer.Tabs = CConfig.Config.Game.Tabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void _UnloadCovers()
|
private static void _UnloadCovers()
|
||||||
|
|||||||
@@ -964,6 +964,11 @@ namespace Vocaluxe.Base
|
|||||||
CPlaylists.SetName(playlistID, name);
|
CPlaylists.SetName(playlistID, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<int> GetIds()
|
||||||
|
{
|
||||||
|
return CPlaylists.Ids;
|
||||||
|
}
|
||||||
|
|
||||||
public List<string> GetNames()
|
public List<string> GetNames()
|
||||||
{
|
{
|
||||||
return CPlaylists.Names;
|
return CPlaylists.Names;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#region license
|
#region license
|
||||||
// This file is part of Vocaluxe.
|
// This file is part of Vocaluxe.
|
||||||
//
|
//
|
||||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||||
@@ -93,6 +93,89 @@ namespace Vocaluxe.Base
|
|||||||
if (_SearchString != "")
|
if (_SearchString != "")
|
||||||
searchStrings = _SearchString.ToUpper().Split(new char[] {' '});
|
searchStrings = _SearchString.ToUpper().Split(new char[] {' '});
|
||||||
|
|
||||||
|
String searchForArtist = null; // a:
|
||||||
|
String searchForTitle = null; // t:
|
||||||
|
String searchForGenre = null; // g:
|
||||||
|
String searchForYear = null; // y:
|
||||||
|
String searchForLanguage = null; // l:
|
||||||
|
String searchForCreator = null; // c:
|
||||||
|
String searchForEdition = null; // e:
|
||||||
|
String searchForAlbum = null; // al:
|
||||||
|
String searchForFileName = null; // fi:
|
||||||
|
String searchForFolderName = null; // fo:
|
||||||
|
bool expertSearch = false;
|
||||||
|
|
||||||
|
if (searchStrings != null)
|
||||||
|
{
|
||||||
|
foreach (String searchToken in searchStrings)
|
||||||
|
{
|
||||||
|
if (searchToken.Length < 3)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
String temp = searchToken.Substring(0, 2);
|
||||||
|
bool foundIt = true;
|
||||||
|
|
||||||
|
switch (temp)
|
||||||
|
{
|
||||||
|
case "A:":
|
||||||
|
searchForArtist = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
case "T:":
|
||||||
|
searchForTitle = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
case "G:":
|
||||||
|
searchForGenre = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
case "Y:":
|
||||||
|
searchForYear = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
case "L:":
|
||||||
|
searchForLanguage = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
case "C:":
|
||||||
|
searchForCreator = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
case "E:":
|
||||||
|
searchForEdition = searchToken.Substring(2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
foundIt = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foundIt)
|
||||||
|
{
|
||||||
|
if (!expertSearch) expertSearch = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchToken.Length < 4)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
foundIt = true;
|
||||||
|
temp = searchToken.Substring(0, 3);
|
||||||
|
|
||||||
|
switch (temp)
|
||||||
|
{
|
||||||
|
case "AL:":
|
||||||
|
searchForAlbum = searchToken.Substring(3);
|
||||||
|
break;
|
||||||
|
case "FI:":
|
||||||
|
searchForFileName = searchToken.Substring(3);
|
||||||
|
break;
|
||||||
|
case "FO:":
|
||||||
|
searchForFolderName = searchToken.Substring(3);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
foundIt = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foundIt && !expertSearch)
|
||||||
|
expertSearch = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach (CSong song in CSongs.Songs)
|
foreach (CSong song in CSongs.Songs)
|
||||||
{
|
{
|
||||||
if (_PlaylistID != -1 && !CBase.Playlist.ContainsSong(_PlaylistID, song.ID))
|
if (_PlaylistID != -1 && !CBase.Playlist.ContainsSong(_PlaylistID, song.ID))
|
||||||
@@ -102,9 +185,85 @@ namespace Vocaluxe.Base
|
|||||||
{
|
{
|
||||||
if (searchStrings == null)
|
if (searchStrings == null)
|
||||||
_FilteredSongs.Add(song);
|
_FilteredSongs.Add(song);
|
||||||
|
else if (expertSearch)
|
||||||
|
{
|
||||||
|
// Stefan1200: Stop at a maximum of 500 search result to prevent performance issues
|
||||||
|
if (_FilteredSongs.Count >= 500)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (searchForAlbum != null && song.Album.ToUpper().Contains(searchForAlbum))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
if (searchForArtist != null && song.Artist.ToUpper().Contains(searchForArtist))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
if (searchForTitle != null && song.Title.ToUpper().Contains(searchForTitle))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
if (searchForCreator != null && song.Creator.ToUpper().Contains(searchForCreator))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
if (searchForFileName != null && song.FileName.ToUpper().Contains(searchForFileName))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
if (searchForFolderName != null && song.FolderName.ToUpper().Contains(searchForFolderName))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
|
||||||
|
if (searchForGenre != null)
|
||||||
|
{
|
||||||
|
foreach (String genre in song.Genres)
|
||||||
|
{
|
||||||
|
if (genre.ToUpper().Contains(searchForGenre))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchForLanguage != null)
|
||||||
|
{
|
||||||
|
foreach (String language in song.Languages)
|
||||||
|
{
|
||||||
|
if (language.ToUpper().Contains(searchForLanguage))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchForEdition != null)
|
||||||
|
{
|
||||||
|
foreach (String edition in song.Editions)
|
||||||
|
{
|
||||||
|
if (edition.ToUpper().Contains(searchForEdition))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchForYear != null)
|
||||||
|
{
|
||||||
|
int pos = searchForYear.IndexOf("-");
|
||||||
|
if (pos == -1)
|
||||||
|
{
|
||||||
|
if (song.Year.Contains(searchForYear))
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
}
|
||||||
|
else if (searchForYear.Length == 9)
|
||||||
|
{
|
||||||
|
int yearStart = -1;
|
||||||
|
int yearEnd = -1;
|
||||||
|
if (!Int32.TryParse(searchForYear.Substring(0, pos), out yearStart))
|
||||||
|
continue;
|
||||||
|
if (!Int32.TryParse(searchForYear.Substring(pos + 1), out yearEnd))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Stefan1200: Prevent searches like 0000-9999, limit for a max distance of 100 years
|
||||||
|
if (yearEnd - yearStart > 100)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int yearSearch = -1;
|
||||||
|
if (!Int32.TryParse(song.Year, out yearSearch))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (yearSearch >= yearStart && yearSearch <= yearEnd)
|
||||||
|
_FilteredSongs.Add(song);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string search = song.Title.ToUpper() + " " + song.Artist.ToUpper() + " " + song.FolderName.ToUpper() + " " + song.FileName.ToUpper();
|
string search = song.Title.ToUpper() + " " + song.Artist.ToUpper();
|
||||||
|
|
||||||
if (searchStrings.All(search.Contains))
|
if (searchStrings.All(search.Contains))
|
||||||
_FilteredSongs.Add(song);
|
_FilteredSongs.Add(song);
|
||||||
|
|||||||
@@ -111,6 +111,24 @@ namespace Vocaluxe.Base
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compares two songs by means of: first letter of sorting field, sorting field, title.
|
||||||
|
/// </summary>
|
||||||
|
private int _SortByLetterFieldTitle(CSongPointer s1, CSongPointer s2)
|
||||||
|
{
|
||||||
|
int res = String.Compare(s1.SortString[0].ToString(), s2.SortString[0].ToString(), StringComparison.CurrentCultureIgnoreCase);
|
||||||
|
return res != 0 ? res : _SortByFieldTitle(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Compares two songs by means of: first letter of sorting field, sorting field, artist, title.
|
||||||
|
/// </summary>
|
||||||
|
private int _SortByLetterFieldArtistTitle(CSongPointer s1, CSongPointer s2)
|
||||||
|
{
|
||||||
|
int res = String.Compare(s1.SortString[0].ToString(), s2.SortString[0].ToString(), StringComparison.CurrentCultureIgnoreCase);
|
||||||
|
return res != 0 ? res : _SortByFieldArtistTitle(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
private void _AddSongToList(CSong song, List<CSongPointer> list)
|
private void _AddSongToList(CSong song, List<CSongPointer> list)
|
||||||
{
|
{
|
||||||
string value = null;
|
string value = null;
|
||||||
@@ -172,15 +190,24 @@ namespace Vocaluxe.Base
|
|||||||
_AddSongToList(song, sortList);
|
_AddSongToList(song, sortList);
|
||||||
switch (_SongSorting)
|
switch (_SongSorting)
|
||||||
{
|
{
|
||||||
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
|
|
||||||
case ESongSorting.TR_CONFIG_ARTIST:
|
case ESongSorting.TR_CONFIG_ARTIST:
|
||||||
case ESongSorting.TR_CONFIG_NONE:
|
case ESongSorting.TR_CONFIG_NONE:
|
||||||
sortList.Sort(_SortByFieldTitle);
|
sortList.Sort(_SortByFieldTitle);
|
||||||
break;
|
break;
|
||||||
|
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
|
||||||
|
sortList.Sort(_SortByLetterFieldTitle);
|
||||||
|
break;
|
||||||
|
case ESongSorting.TR_CONFIG_TITLE_LETTER:
|
||||||
|
sortList.Sort(_SortByLetterFieldArtistTitle);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
sortList.Sort(_SortByFieldArtistTitle);
|
sortList.Sort(_SortByFieldArtistTitle);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_SongSorting == ESongSorting.TR_CONFIG_DATEADDED)
|
||||||
|
sortList.Reverse();
|
||||||
|
|
||||||
_SortedSongs = sortList.ToArray();
|
_SortedSongs = sortList.ToArray();
|
||||||
_Changed = false;
|
_Changed = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -397,7 +397,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
|
|||||||
{
|
{
|
||||||
lock (_GetLockToken(pAcDecoder))
|
lock (_GetLockToken(pAcDecoder))
|
||||||
{
|
{
|
||||||
return _ac_get_audio_frame(pAcInstance, pAcDecoder) != 0;
|
return _ac_get_audio_frame(pAcInstance, pAcDecoder) == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,7 +408,8 @@ namespace Vocaluxe.Lib.Video.Acinerella
|
|||||||
{
|
{
|
||||||
lock (_GetLockToken(pAcDecoder))
|
lock (_GetLockToken(pAcDecoder))
|
||||||
{
|
{
|
||||||
return _ac_get_frame(pAcInstance, pAcDecoder) != 0;
|
int asd = _ac_get_frame(pAcInstance, pAcDecoder);
|
||||||
|
return asd == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -419,14 +420,14 @@ namespace Vocaluxe.Lib.Video.Acinerella
|
|||||||
{
|
{
|
||||||
lock (_GetLockToken(pAcDecoder))
|
lock (_GetLockToken(pAcDecoder))
|
||||||
{
|
{
|
||||||
return _ac_skip_frames(pAcInstance, pAcDecoder, num) != 0;
|
return _ac_skip_frames(pAcInstance, pAcDecoder, num) == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seeks to the given target position in the file. The seek funtion is not able to seek a single audio/video stream
|
// Seeks to the given target position in the file. The seek funtion is not able to seek a single audio/video stream
|
||||||
// but seeks the whole file forward. The deocder parameter is only used as an timecode reference.
|
// but seeks the whole file forward. The deocder parameter is only used as an timecode reference.
|
||||||
// The parameter "dir" specifies the seek direction: 0 for forward, -1 for backward.
|
// The parameter "dir" specifies the seek direction: 0 for forward, -1 for backward.
|
||||||
// The target_pos paremeter is in milliseconds. Returns 1 if the functions succeded.}
|
// The target_pos paremeter is in milliseconds. Returns 0 if the functions succeded.}
|
||||||
//function ac_seek(pDecoder: PAc_decoder; dir: integer; target_pos: int64): integer; cdecl; external ac_dll;
|
//function ac_seek(pDecoder: PAc_decoder; dir: integer; target_pos: int64): integer; cdecl; external ac_dll;
|
||||||
[DllImport(_AcDll, EntryPoint = "ac_seek", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
|
[DllImport(_AcDll, EntryPoint = "ac_seek", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
|
||||||
private static extern Int32 _ac_seek(IntPtr pAcDecoder, Int32 dir, Int64 targetPos);
|
private static extern Int32 _ac_seek(IntPtr pAcDecoder, Int32 dir, Int64 targetPos);
|
||||||
@@ -435,7 +436,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
|
|||||||
{
|
{
|
||||||
lock (_GetLockToken(pAcDecoder))
|
lock (_GetLockToken(pAcDecoder))
|
||||||
{
|
{
|
||||||
return _ac_seek(pAcDecoder, dir, targetPos) != 0;
|
return _ac_seek(pAcDecoder, dir, targetPos) == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include <libavformat/avio.h>
|
#include <libavformat/avio.h>
|
||||||
#include <libavcodec/avcodec.h>
|
#include <libavcodec/avcodec.h>
|
||||||
#include <libavutil/avutil.h>
|
#include <libavutil/avutil.h>
|
||||||
#include "libavutil/imgutils.h"
|
#include <libavutil/imgutils.h>
|
||||||
#include <libswscale/swscale.h>
|
#include <libswscale/swscale.h>
|
||||||
#include <libswresample/swresample.h>
|
#include <libswresample/swresample.h>
|
||||||
|
|
||||||
@@ -37,17 +37,17 @@
|
|||||||
#define PROBE_BUF_MAX (1 << 20)
|
#define PROBE_BUF_MAX (1 << 20)
|
||||||
|
|
||||||
#define ERR(E) \
|
#define ERR(E) \
|
||||||
{ \
|
do { \
|
||||||
if (!(E)) { \
|
if (!(E)) { \
|
||||||
goto error; \
|
goto error; \
|
||||||
} \
|
} \
|
||||||
}
|
} while (0)
|
||||||
#define AV_ERR(E) \
|
#define AV_ERR(E) \
|
||||||
{ \
|
do { \
|
||||||
if ((E) < 0) { \
|
if ((E) < 0) { \
|
||||||
goto error; \
|
goto error; \
|
||||||
} \
|
} \
|
||||||
}
|
} while (0)
|
||||||
|
|
||||||
struct _ac_data {
|
struct _ac_data {
|
||||||
ac_instance instance;
|
ac_instance instance;
|
||||||
@@ -141,6 +141,13 @@ void init_info(lp_ac_file_info info)
|
|||||||
info->bitrate = -1;
|
info->bitrate = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* avcodec_register_all(), av_register_all() deprecated since lavc 58.9.100 */
|
||||||
|
#if (LIBAVCODEC_VERSION_MAJOR < 58) || \
|
||||||
|
((LIBAVCODEC_VERSION_MAJOR == 58) && (LIBAVCODEC_VERSION_MINOR < 9))
|
||||||
|
#define AC_NEED_REGISTER_ALL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef AC_NEED_REGISTER_ALL
|
||||||
int av_initialized = 0;
|
int av_initialized = 0;
|
||||||
void ac_init_ffmpeg()
|
void ac_init_ffmpeg()
|
||||||
{
|
{
|
||||||
@@ -151,14 +158,17 @@ void ac_init_ffmpeg()
|
|||||||
av_initialized = 1;
|
av_initialized = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* AC_NEED_REGISTER_ALL */
|
||||||
|
|
||||||
lp_ac_instance CALL_CONVT ac_init(void)
|
lp_ac_instance CALL_CONVT ac_init(void)
|
||||||
{
|
{
|
||||||
|
#ifdef AC_NEED_REGISTER_ALL
|
||||||
ac_init_ffmpeg();
|
ac_init_ffmpeg();
|
||||||
|
#endif /* AC_NEED_REGISTER_ALL */
|
||||||
|
|
||||||
// Allocate a new instance of the videoplayer data and return it
|
// Allocate a new instance of the videoplayer data and return it
|
||||||
lp_ac_data ptmp;
|
lp_ac_data ptmp;
|
||||||
ptmp = (lp_ac_data)av_malloc(sizeof(ac_data));
|
ERR(ptmp = (lp_ac_data)av_malloc(sizeof(ac_data)));
|
||||||
|
|
||||||
// Initialize the created structure
|
// Initialize the created structure
|
||||||
memset(ptmp, 0, sizeof(ac_data));
|
memset(ptmp, 0, sizeof(ac_data));
|
||||||
@@ -168,11 +178,16 @@ lp_ac_instance CALL_CONVT ac_init(void)
|
|||||||
ptmp->instance.output_format = AC_OUTPUT_BGR24;
|
ptmp->instance.output_format = AC_OUTPUT_BGR24;
|
||||||
init_info(&(ptmp->instance.info));
|
init_info(&(ptmp->instance.info));
|
||||||
return (lp_ac_instance)ptmp;
|
return (lp_ac_instance)ptmp;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
lp_ac_instance CALL_CONVT ac_init_of(ac_output_format outputFormat)
|
lp_ac_instance CALL_CONVT ac_init_of(ac_output_format outputFormat)
|
||||||
{
|
{
|
||||||
|
#ifdef AC_NEED_REGISTER_ALL
|
||||||
ac_init_ffmpeg();
|
ac_init_ffmpeg();
|
||||||
|
#endif /* AC_NEED_REGISTER_ALL */
|
||||||
|
|
||||||
// Allocate a new instance of the videoplayer data and return it
|
// Allocate a new instance of the videoplayer data and return it
|
||||||
lp_ac_data ptmp;
|
lp_ac_data ptmp;
|
||||||
@@ -206,9 +221,11 @@ static int io_read(void *opaque, uint8_t *buf, int buf_size)
|
|||||||
// If there is still memory in the probe buffer, consume this memory first
|
// If there is still memory in the probe buffer, consume this memory first
|
||||||
if (self->probe_buffer &&
|
if (self->probe_buffer &&
|
||||||
self->probe_buffer_offs < self->probe_buffer_size) {
|
self->probe_buffer_offs < self->probe_buffer_size) {
|
||||||
|
|
||||||
|
unsigned int buf_size_u = (unsigned int)buf_size;
|
||||||
// Copy as many bytes as possible from the probe buffer
|
// Copy as many bytes as possible from the probe buffer
|
||||||
size_t cnt =
|
size_t cnt =
|
||||||
MIN(buf_size, self->probe_buffer_size - self->probe_buffer_offs);
|
MIN(buf_size_u, self->probe_buffer_size - self->probe_buffer_offs);
|
||||||
memcpy(buf, self->probe_buffer + self->probe_buffer_offs, cnt);
|
memcpy(buf, self->probe_buffer + self->probe_buffer_offs, cnt);
|
||||||
|
|
||||||
// Advance the read/write pointers
|
// Advance the read/write pointers
|
||||||
@@ -223,6 +240,9 @@ static int io_read(void *opaque, uint8_t *buf, int buf_size)
|
|||||||
self->probe_buffer_size = 0;
|
self->probe_buffer_size = 0;
|
||||||
self->probe_buffer_offs = 0;
|
self->probe_buffer_offs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the actual bytes obtained from the memory buffer
|
||||||
|
return (int)cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to read the memory from the probe buffer
|
// Try to read the memory from the probe buffer
|
||||||
@@ -238,6 +258,17 @@ static int64_t io_seek(void *opaque, int64_t pos, int whence)
|
|||||||
lp_ac_data self = ((lp_ac_data)opaque);
|
lp_ac_data self = ((lp_ac_data)opaque);
|
||||||
if (self->seek_proc != NULL) {
|
if (self->seek_proc != NULL) {
|
||||||
if ((whence >= 0) && (whence <= 2)) {
|
if ((whence >= 0) && (whence <= 2)) {
|
||||||
|
// Throw away the probe buffer if seek is performed.
|
||||||
|
// NOTE: This could be improved to check if the seek
|
||||||
|
// is inside the probe_buffer, but it would get really
|
||||||
|
// complicated as real seek would need to be omitted
|
||||||
|
// then.
|
||||||
|
if (self->probe_buffer) {
|
||||||
|
av_free(self->probe_buffer);
|
||||||
|
self->probe_buffer = NULL;
|
||||||
|
self->probe_buffer_size = 0;
|
||||||
|
self->probe_buffer_offs = 0;
|
||||||
|
}
|
||||||
return self->seek_proc(self->sender, pos, whence);
|
return self->seek_proc(self->sender, pos, whence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -251,8 +282,10 @@ lp_ac_proberesult CALL_CONVT ac_probe_input_buffer(uint8_t *buf, int bufsize,
|
|||||||
AVProbeData pd;
|
AVProbeData pd;
|
||||||
AVInputFormat *fmt = NULL;
|
AVInputFormat *fmt = NULL;
|
||||||
|
|
||||||
|
#ifdef AC_NEED_REGISTER_ALL
|
||||||
// Initialize FFMpeg libraries
|
// Initialize FFMpeg libraries
|
||||||
ac_init_ffmpeg();
|
ac_init_ffmpeg();
|
||||||
|
#endif /* AC_NEED_REGISTER_ALL */
|
||||||
|
|
||||||
// Set the filename and mime_type
|
// Set the filename and mime_type
|
||||||
pd.mime_type = "";
|
pd.mime_type = "";
|
||||||
@@ -263,7 +296,8 @@ lp_ac_proberesult CALL_CONVT ac_probe_input_buffer(uint8_t *buf, int bufsize,
|
|||||||
|
|
||||||
// The given buffer has to be copied to a new one, which is aligned and
|
// The given buffer has to be copied to a new one, which is aligned and
|
||||||
// padded
|
// padded
|
||||||
uint8_t *aligned_buf = av_malloc(bufsize + AVPROBE_PADDING_SIZE);
|
uint8_t *aligned_buf;
|
||||||
|
ERR(aligned_buf = av_malloc(bufsize + AVPROBE_PADDING_SIZE));
|
||||||
memset(aligned_buf, 0, bufsize + AVPROBE_PADDING_SIZE);
|
memset(aligned_buf, 0, bufsize + AVPROBE_PADDING_SIZE);
|
||||||
memcpy(aligned_buf, buf, bufsize);
|
memcpy(aligned_buf, buf, bufsize);
|
||||||
|
|
||||||
@@ -282,6 +316,9 @@ lp_ac_proberesult CALL_CONVT ac_probe_input_buffer(uint8_t *buf, int bufsize,
|
|||||||
av_free(aligned_buf);
|
av_free(aligned_buf);
|
||||||
|
|
||||||
return (lp_ac_proberesult)fmt;
|
return (lp_ac_proberesult)fmt;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
AVInputFormat *ac_probe_input_stream(void *sender, ac_read_callback read_proc,
|
AVInputFormat *ac_probe_input_stream(void *sender, ac_read_callback read_proc,
|
||||||
@@ -302,6 +339,9 @@ AVInputFormat *ac_probe_input_stream(void *sender, ac_read_callback read_proc,
|
|||||||
|
|
||||||
// Allocate some memory for the current probe buffer
|
// Allocate some memory for the current probe buffer
|
||||||
uint8_t *tmp_buf = av_malloc(probe_size);
|
uint8_t *tmp_buf = av_malloc(probe_size);
|
||||||
|
if (!tmp_buf) {
|
||||||
|
return fmt; // An error occurred, abort
|
||||||
|
}
|
||||||
memset(tmp_buf, 0, probe_size);
|
memset(tmp_buf, 0, probe_size);
|
||||||
|
|
||||||
// Copy the old data to the new buffer
|
// Copy the old data to the new buffer
|
||||||
@@ -309,6 +349,8 @@ AVInputFormat *ac_probe_input_stream(void *sender, ac_read_callback read_proc,
|
|||||||
memcpy(tmp_buf, *buf, *buf_read);
|
memcpy(tmp_buf, *buf, *buf_read);
|
||||||
// Free the old data memory
|
// Free the old data memory
|
||||||
av_free(*buf);
|
av_free(*buf);
|
||||||
|
// Zero the pointer to avoid double free on read_proc error
|
||||||
|
*buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the new data
|
// Read the new data
|
||||||
@@ -319,6 +361,7 @@ AVInputFormat *ac_probe_input_stream(void *sender, ac_read_callback read_proc,
|
|||||||
return fmt; // An error occurred, abort
|
return fmt; // An error occurred, abort
|
||||||
}
|
}
|
||||||
if (size < read_size) {
|
if (size < read_size) {
|
||||||
|
av_free(tmp_buf);
|
||||||
last_iteration = 1;
|
last_iteration = 1;
|
||||||
probe_size = (int)*buf_read + size;
|
probe_size = (int)*buf_read + size;
|
||||||
}
|
}
|
||||||
@@ -341,7 +384,8 @@ static void cpymetadata(const AVFormatContext *ctx, const char *key, char *tar,
|
|||||||
{
|
{
|
||||||
const AVDictionaryEntry *entry = av_dict_get(ctx->metadata, key, NULL, 0);
|
const AVDictionaryEntry *entry = av_dict_get(ctx->metadata, key, NULL, 0);
|
||||||
if (entry) {
|
if (entry) {
|
||||||
strncpy_s(tar, len, entry->value, len);
|
strncpy_s(tar, len, entry->value, len-1);
|
||||||
|
tar[len - 1] = '\0';
|
||||||
} else {
|
} else {
|
||||||
strncpy_s(tar, len, "", len);
|
strncpy_s(tar, len, "", len);
|
||||||
}
|
}
|
||||||
@@ -413,6 +457,7 @@ int CALL_CONVT ac_open(lp_ac_instance pacInstance, void *sender,
|
|||||||
// Call the file open proc
|
// Call the file open proc
|
||||||
if (self->open_proc != NULL) {
|
if (self->open_proc != NULL) {
|
||||||
if (self->open_proc(sender) < 0) {
|
if (self->open_proc(sender) < 0) {
|
||||||
|
ac_close(pacInstance);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,22 +479,27 @@ int CALL_CONVT ac_open(lp_ac_instance pacInstance, void *sender,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reserve the buffer memory and initialise the context
|
// Reserve the buffer memory and initialise the context
|
||||||
self->buffer = av_malloc(AC_BUFSIZE);
|
ERR(self->buffer = av_malloc(AC_BUFSIZE));
|
||||||
self->pIo = avio_alloc_context(self->buffer, AC_BUFSIZE, 0, self, io_read,
|
ERR(self->pIo = avio_alloc_context(self->buffer, AC_BUFSIZE, 0, self, io_read,
|
||||||
0, seek_proc ? io_seek : NULL);
|
0, seek_proc ? io_seek : NULL));
|
||||||
self->pIo->seekable = seek_proc != NULL;
|
self->pIo->seekable = seek_proc != NULL;
|
||||||
|
|
||||||
// Open the given input stream (the io structure) with the given format of
|
// Open the given input stream (the io structure) with the given format of
|
||||||
// the stream (fmt) and write the pointer to the new format context to the
|
// the stream (fmt) and write the pointer to the new format context to the
|
||||||
// pFormatCtx variable
|
// pFormatCtx variable
|
||||||
self->pFormatCtx = avformat_alloc_context();
|
ERR(self->pFormatCtx = avformat_alloc_context());
|
||||||
self->pFormatCtx->pb = self->pIo;
|
self->pFormatCtx->pb = self->pIo;
|
||||||
|
|
||||||
if (avformat_open_input(&(self->pFormatCtx), "", fmt, NULL) < 0) {
|
if (avformat_open_input(&(self->pFormatCtx), "", fmt, NULL) < 0) {
|
||||||
ac_close(pacInstance);
|
ac_close(pacInstance);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return finalize_open(pacInstance);
|
return finalize_open(pacInstance);
|
||||||
|
|
||||||
|
error:
|
||||||
|
ac_close(pacInstance);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CALL_CONVT ac_open_file(lp_ac_instance pacInstance, const char *filename)
|
int CALL_CONVT ac_open_file(lp_ac_instance pacInstance, const char *filename)
|
||||||
@@ -601,16 +651,19 @@ void CALL_CONVT ac_get_stream_info(lp_ac_instance pacInstance, int nb,
|
|||||||
lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance)
|
lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance)
|
||||||
{
|
{
|
||||||
// Allocate the result packet
|
// Allocate the result packet
|
||||||
lp_ac_package_data pkt = av_malloc(sizeof(ac_package_data));
|
lp_ac_package_data pkt;
|
||||||
|
ERR(pkt = av_malloc(sizeof(ac_package_data)));
|
||||||
memset(pkt, 0, sizeof(ac_package_data));
|
memset(pkt, 0, sizeof(ac_package_data));
|
||||||
pkt->pPack = av_malloc(sizeof(AVPacket));
|
ERR(pkt->pPack = av_malloc(sizeof(AVPacket)));
|
||||||
|
|
||||||
av_init_packet(pkt->pPack);
|
av_init_packet(pkt->pPack);
|
||||||
pkt->pPack->data = NULL;
|
pkt->pPack->data = NULL;
|
||||||
pkt->pPack->size = 0;
|
pkt->pPack->size = 0;
|
||||||
|
|
||||||
// Try to read package
|
// Try to read package
|
||||||
if (av_read_frame(((lp_ac_data)(pacInstance))->pFormatCtx, pkt->pPack) >=
|
int av_read_frame_status =
|
||||||
|
av_read_frame(((lp_ac_data)(pacInstance))->pFormatCtx, pkt->pPack);
|
||||||
|
if (av_read_frame_status >=
|
||||||
0) {
|
0) {
|
||||||
if (pkt->pPack->dts != AV_NOPTS_VALUE) {
|
if (pkt->pPack->dts != AV_NOPTS_VALUE) {
|
||||||
pkt->pts = (int)pkt->pPack->dts;
|
pkt->pts = (int)pkt->pPack->dts;
|
||||||
@@ -620,6 +673,10 @@ lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance)
|
|||||||
}
|
}
|
||||||
ac_free_package((lp_ac_package)pkt);
|
ac_free_package((lp_ac_package)pkt);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
error:
|
||||||
|
ac_free_package((lp_ac_package)pkt);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Frees the currently loaded package
|
// Frees the currently loaded package
|
||||||
@@ -627,15 +684,7 @@ void CALL_CONVT ac_free_package(lp_ac_package pPackage)
|
|||||||
{
|
{
|
||||||
if (pPackage) {
|
if (pPackage) {
|
||||||
lp_ac_package_data self = (lp_ac_package_data)pPackage;
|
lp_ac_package_data self = (lp_ac_package_data)pPackage;
|
||||||
if (self->pPack) {
|
av_packet_unref(self->pPack);
|
||||||
if (self->pPack->buf) {
|
|
||||||
av_buffer_unref(&self->pPack->buf);
|
|
||||||
}
|
|
||||||
self->pPack->data = NULL;
|
|
||||||
self->pPack->size = 0;
|
|
||||||
|
|
||||||
av_packet_free_side_data(self->pPack);
|
|
||||||
}
|
|
||||||
av_free(self->pPack);
|
av_free(self->pPack);
|
||||||
av_free(self);
|
av_free(self);
|
||||||
}
|
}
|
||||||
@@ -672,7 +721,7 @@ void *ac_create_video_decoder(lp_ac_instance pacInstance,
|
|||||||
{
|
{
|
||||||
// Allocate memory for a new decoder instance
|
// Allocate memory for a new decoder instance
|
||||||
lp_ac_video_decoder pDecoder;
|
lp_ac_video_decoder pDecoder;
|
||||||
pDecoder = (lp_ac_video_decoder)(av_malloc(sizeof(ac_video_decoder)));
|
ERR(pDecoder = (lp_ac_video_decoder)(av_malloc(sizeof(ac_video_decoder))));
|
||||||
memset(pDecoder, 0, sizeof(ac_video_decoder));
|
memset(pDecoder, 0, sizeof(ac_video_decoder));
|
||||||
|
|
||||||
// Set a few properties
|
// Set a few properties
|
||||||
@@ -686,20 +735,26 @@ void *ac_create_video_decoder(lp_ac_instance pacInstance,
|
|||||||
// Find correspondenting codec
|
// Find correspondenting codec
|
||||||
if (!(pDecoder->pCodec =
|
if (!(pDecoder->pCodec =
|
||||||
avcodec_find_decoder(pCodecParam->codec_id))) {
|
avcodec_find_decoder(pCodecParam->codec_id))) {
|
||||||
|
ac_free_video_decoder(pDecoder);
|
||||||
return NULL; // Codec could not have been found
|
return NULL; // Codec could not have been found
|
||||||
}
|
}
|
||||||
|
|
||||||
pDecoder->pCodecCtx = avcodec_alloc_context3(pDecoder->pCodec);
|
ERR(pDecoder->pCodecCtx = avcodec_alloc_context3(pDecoder->pCodec));
|
||||||
avcodec_parameters_to_context(pDecoder->pCodecCtx, pCodecParam);
|
if (avcodec_parameters_to_context(pDecoder->pCodecCtx, pCodecParam) < 0)
|
||||||
|
{
|
||||||
|
ac_free_video_decoder(pDecoder);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Open codec
|
// Open codec
|
||||||
if (avcodec_open2(pDecoder->pCodecCtx, pDecoder->pCodec, NULL) < 0) {
|
if (avcodec_open2(pDecoder->pCodecCtx, pDecoder->pCodec, NULL) < 0) {
|
||||||
|
ac_free_video_decoder(pDecoder);
|
||||||
return NULL; // Codec could not have been opened
|
return NULL; // Codec could not have been opened
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reserve frame variables
|
// Reserve frame variables
|
||||||
pDecoder->pFrame = av_frame_alloc();
|
ERR(pDecoder->pFrame = av_frame_alloc());
|
||||||
pDecoder->pFrameRGB = av_frame_alloc();
|
ERR(pDecoder->pFrameRGB = av_frame_alloc());
|
||||||
|
|
||||||
pDecoder->pSwsCtx = NULL;
|
pDecoder->pSwsCtx = NULL;
|
||||||
|
|
||||||
@@ -712,14 +767,22 @@ void *ac_create_video_decoder(lp_ac_instance pacInstance,
|
|||||||
(uint8_t *)av_malloc(pDecoder->decoder.buffer_size);
|
(uint8_t *)av_malloc(pDecoder->decoder.buffer_size);
|
||||||
|
|
||||||
// Link decoder to buffer
|
// Link decoder to buffer
|
||||||
av_image_fill_arrays(pDecoder->pFrameRGB->data,
|
if(av_image_fill_arrays(pDecoder->pFrameRGB->data,
|
||||||
pDecoder->pFrameRGB->linesize,
|
pDecoder->pFrameRGB->linesize,
|
||||||
pDecoder->decoder.pBuffer,
|
pDecoder->decoder.pBuffer,
|
||||||
convert_pix_format(pacInstance->output_format),
|
convert_pix_format(pacInstance->output_format),
|
||||||
pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height,
|
pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height,
|
||||||
1);
|
1) < 0)
|
||||||
|
{
|
||||||
|
ac_free_video_decoder(pDecoder);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return (void *)pDecoder;
|
return (void *)pDecoder;
|
||||||
|
|
||||||
|
error:
|
||||||
|
ac_free_video_decoder(pDecoder);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init a audio decoder
|
// Init a audio decoder
|
||||||
@@ -771,8 +834,8 @@ void *ac_create_audio_decoder(lp_ac_instance pacInstance,
|
|||||||
if (out_fmt == AV_SAMPLE_FMT_DBL || out_fmt == AV_SAMPLE_FMT_S32) {
|
if (out_fmt == AV_SAMPLE_FMT_DBL || out_fmt == AV_SAMPLE_FMT_S32) {
|
||||||
out_fmt = AV_SAMPLE_FMT_FLT;
|
out_fmt = AV_SAMPLE_FMT_FLT;
|
||||||
}
|
}
|
||||||
pDecoder->pSwrCtx = swr_alloc_set_opts(NULL, layout, out_fmt, rate,
|
ERR(pDecoder->pSwrCtx = swr_alloc_set_opts(NULL, layout, out_fmt, rate,
|
||||||
layout, fmt, rate, 0, NULL);
|
layout, fmt, rate, 0, NULL));
|
||||||
AV_ERR(swr_init(pDecoder->pSwrCtx));
|
AV_ERR(swr_init(pDecoder->pSwrCtx));
|
||||||
}
|
}
|
||||||
return (void *)pDecoder;
|
return (void *)pDecoder;
|
||||||
@@ -813,31 +876,45 @@ int ac_decode_video_package(lp_ac_package pPackage,
|
|||||||
{
|
{
|
||||||
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
||||||
|
|
||||||
if(avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) != 0)
|
if(avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) != 0)
|
int avcodec_receive_frame_response;
|
||||||
|
|
||||||
|
do
|
||||||
{
|
{
|
||||||
return 0;
|
avcodec_receive_frame_response = avcodec_receive_frame(pDecoder->pCodecCtx,
|
||||||
|
pDecoder->pFrame);
|
||||||
|
if (avcodec_receive_frame_response == AVERROR(EAGAIN) ||
|
||||||
|
avcodec_receive_frame_response == AVERROR_EOF) {
|
||||||
|
return avcodec_receive_frame_response;
|
||||||
}
|
}
|
||||||
|
|
||||||
pDecoder->pSwsCtx = sws_getCachedContext(
|
} while (avcodec_receive_frame_response > 0);
|
||||||
|
|
||||||
|
if((pDecoder->pSwsCtx = sws_getCachedContext(
|
||||||
pDecoder->pSwsCtx, pDecoder->pCodecCtx->width,
|
pDecoder->pSwsCtx, pDecoder->pCodecCtx->width,
|
||||||
pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt,
|
pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt,
|
||||||
pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height,
|
pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height,
|
||||||
convert_pix_format(pDecoder->decoder.pacInstance->output_format),
|
convert_pix_format(pDecoder->decoder.pacInstance->output_format),
|
||||||
SWS_BICUBIC, NULL, NULL, NULL);
|
SWS_BICUBIC, NULL, NULL, NULL)) < 0)
|
||||||
|
{
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
sws_scale(pDecoder->pSwsCtx,
|
if(sws_scale(pDecoder->pSwsCtx,
|
||||||
(const uint8_t *const *)(pDecoder->pFrame->data),
|
(const uint8_t *const *)(pDecoder->pFrame->data),
|
||||||
pDecoder->pFrame->linesize,
|
pDecoder->pFrame->linesize,
|
||||||
0, //?
|
0, //?
|
||||||
pDecoder->pCodecCtx->height, pDecoder->pFrameRGB->data,
|
pDecoder->pCodecCtx->height, pDecoder->pFrameRGB->data,
|
||||||
pDecoder->pFrameRGB->linesize);
|
pDecoder->pFrameRGB->linesize) < 0)
|
||||||
return 1;
|
{
|
||||||
|
return -4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ac_skip_video_package(lp_ac_package pPackage,
|
int ac_skip_video_package(lp_ac_package pPackage,
|
||||||
@@ -845,17 +922,17 @@ int ac_skip_video_package(lp_ac_package pPackage,
|
|||||||
{
|
{
|
||||||
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
||||||
|
|
||||||
if (avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) != 0)
|
if (avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) != 0)
|
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ac_decode_audio_package(lp_ac_package pPackage,
|
int ac_decode_audio_package(lp_ac_package pPackage,
|
||||||
@@ -865,14 +942,14 @@ int ac_decode_audio_package(lp_ac_package pPackage,
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
||||||
|
|
||||||
if (avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) != 0)
|
if (avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) != 0)
|
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the output buffer size
|
// Calculate the output buffer size
|
||||||
@@ -885,38 +962,42 @@ int ac_decode_audio_package(lp_ac_package pPackage,
|
|||||||
|
|
||||||
if (pDecoder->pSwrCtx) {
|
if (pDecoder->pSwrCtx) {
|
||||||
if (pDecoder->own_buffer_size != buffer_size) {
|
if (pDecoder->own_buffer_size != buffer_size) {
|
||||||
pDecoder->decoder.pBuffer =
|
ERR(pDecoder->decoder.pBuffer =
|
||||||
av_realloc(pDecoder->decoder.pBuffer, buffer_size);
|
av_realloc(pDecoder->decoder.pBuffer, buffer_size));
|
||||||
pDecoder->own_buffer_size = buffer_size;
|
pDecoder->own_buffer_size = buffer_size;
|
||||||
}
|
}
|
||||||
swr_convert(pDecoder->pSwrCtx, &(pDecoder->decoder.pBuffer),
|
if(swr_convert(pDecoder->pSwrCtx, &(pDecoder->decoder.pBuffer),
|
||||||
sample_count, (const uint8_t **)(pDecoder->pFrame->data),
|
sample_count, (const uint8_t **)(pDecoder->pFrame->data),
|
||||||
sample_count);
|
sample_count) < 0)
|
||||||
|
{
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// No conversion needs to be done, simply set the buffer pointer
|
// No conversion needs to be done, simply set the buffer pointer
|
||||||
pDecoder->decoder.pBuffer = pDecoder->pFrame->data[0];
|
pDecoder->decoder.pBuffer = pDecoder->pFrame->data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
return got_frame;
|
return got_frame;
|
||||||
|
error:
|
||||||
|
return -4;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ac_skip_audio_package(lp_ac_package pPackage,
|
int ac_skip_audio_package(lp_ac_package pPackage,
|
||||||
lp_ac_audio_decoder pDecoder)
|
lp_ac_audio_decoder pDecoder)
|
||||||
{
|
{
|
||||||
int got_frame = 0;
|
|
||||||
int len = 0;
|
int len = 0;
|
||||||
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
lp_ac_package_data pkt = ((lp_ac_package_data)pPackage);
|
||||||
if (avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) != 0)
|
if (avcodec_send_packet(pDecoder->pCodecCtx, pkt->pPack) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) != 0)
|
if (avcodec_receive_frame(pDecoder->pCodecCtx, pDecoder->pFrame) < 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return got_frame;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
|
int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
|
||||||
@@ -957,7 +1038,7 @@ int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
|
|||||||
} else if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
|
} else if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
|
||||||
return ac_decode_audio_package(pPackage, (lp_ac_audio_decoder)pDecoder);
|
return ac_decode_audio_package(pPackage, (lp_ac_audio_decoder)pDecoder);
|
||||||
}
|
}
|
||||||
return 0;
|
return -10;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CALL_CONVT ac_skip_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
|
int CALL_CONVT ac_skip_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
|
||||||
@@ -1000,14 +1081,14 @@ int CALL_CONVT ac_skip_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
|
|||||||
else if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
|
else if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
|
||||||
return ac_skip_audio_package(pPackage, (lp_ac_audio_decoder)pDecoder);
|
return ac_skip_audio_package(pPackage, (lp_ac_audio_decoder)pDecoder);
|
||||||
}
|
}
|
||||||
return 0;
|
return -9;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CALL_CONVT ac_skip_frames(lp_ac_instance pacInstance, lp_ac_decoder pDecoder, int num)
|
int CALL_CONVT ac_skip_frames(lp_ac_instance pacInstance, lp_ac_decoder pDecoder, int num)
|
||||||
{
|
{
|
||||||
if (pDecoder == NULL)
|
if (pDecoder == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int skipedFrames = 0;
|
int skipedFrames = 0;
|
||||||
@@ -1018,7 +1099,7 @@ int CALL_CONVT ac_skip_frames(lp_ac_instance pacInstance, lp_ac_decoder pDecoder
|
|||||||
if (pckt != NULL)
|
if (pckt != NULL)
|
||||||
{
|
{
|
||||||
// Decode the package to figure out if its completing a frame
|
// Decode the package to figure out if its completing a frame
|
||||||
if (pckt->stream_index == pDecoder->stream_index && ac_skip_package(pckt, pDecoder) != 0)
|
if (pckt->stream_index == pDecoder->stream_index && ac_skip_package(pckt, pDecoder) == 0)
|
||||||
{
|
{
|
||||||
skipedFrames++;
|
skipedFrames++;
|
||||||
}
|
}
|
||||||
@@ -1027,17 +1108,17 @@ int CALL_CONVT ac_skip_frames(lp_ac_instance pacInstance, lp_ac_decoder pDecoder
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CALL_CONVT ac_get_frame(lp_ac_instance pacInstance, lp_ac_decoder pDecoder)
|
int CALL_CONVT ac_get_frame(lp_ac_instance pacInstance, lp_ac_decoder pDecoder)
|
||||||
{
|
{
|
||||||
if (pDecoder == NULL)
|
if (pDecoder == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
@@ -1045,7 +1126,7 @@ int CALL_CONVT ac_get_frame(lp_ac_instance pacInstance, lp_ac_decoder pDecoder)
|
|||||||
lp_ac_package pckt = ac_read_package(pacInstance);
|
lp_ac_package pckt = ac_read_package(pacInstance);
|
||||||
if (pckt == NULL)
|
if (pckt == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pckt->stream_index != pDecoder->stream_index)
|
if(pckt->stream_index != pDecoder->stream_index)
|
||||||
@@ -1054,14 +1135,17 @@ int CALL_CONVT ac_get_frame(lp_ac_instance pacInstance, lp_ac_decoder pDecoder)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The packet is for the video stream, try to decode it
|
// The packet is for the video stream, try to decode it
|
||||||
if (ac_decode_package(pckt, pDecoder) != 0)
|
int _status = ac_decode_package(pckt, pDecoder);
|
||||||
{
|
|
||||||
ac_free_package(pckt);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ac_free_package(pckt);
|
ac_free_package(pckt);
|
||||||
|
|
||||||
|
if (_status > 0 || _status == AVERROR(EAGAIN))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _status;
|
||||||
|
|
||||||
} while (true);
|
} while (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,7 +1153,7 @@ int CALL_CONVT ac_get_audio_frame(lp_ac_instance pacInstance, lp_ac_decoder pDec
|
|||||||
{
|
{
|
||||||
if (pDecoder == NULL)
|
if (pDecoder == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
do
|
||||||
@@ -1077,7 +1161,7 @@ int CALL_CONVT ac_get_audio_frame(lp_ac_instance pacInstance, lp_ac_decoder pDec
|
|||||||
lp_ac_package pckt = ac_read_package(pacInstance);
|
lp_ac_package pckt = ac_read_package(pacInstance);
|
||||||
if (pckt == NULL)
|
if (pckt == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pckt->stream_index != pDecoder->stream_index)
|
if (pckt->stream_index != pDecoder->stream_index)
|
||||||
@@ -1085,15 +1169,16 @@ int CALL_CONVT ac_get_audio_frame(lp_ac_instance pacInstance, lp_ac_decoder pDec
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The packet is for the audio stream, try to decode it
|
// The packet is for the video stream, try to decode it
|
||||||
if (ac_decode_package(pckt, pDecoder) != 0)
|
int _status = ac_decode_package(pckt, pDecoder);
|
||||||
{
|
|
||||||
ac_free_package(pckt);
|
ac_free_package(pckt);
|
||||||
return 1;
|
|
||||||
|
if (_status > 0 || _status == AVERROR(EAGAIN)) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ac_free_package(pckt);
|
return _status;
|
||||||
|
|
||||||
} while (true);
|
} while (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1115,18 +1200,18 @@ int CALL_CONVT ac_seek(lp_ac_decoder pDecoder, int dir, int64_t target_pos)
|
|||||||
pDecoder->stream_index,
|
pDecoder->stream_index,
|
||||||
av_rescale_q(pos, AV_TIME_BASE_Q, timebase),
|
av_rescale_q(pos, AV_TIME_BASE_Q, timebase),
|
||||||
flags) >= 0) {
|
flags) >= 0) {
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free video decoder
|
// Free video decoder
|
||||||
void ac_free_video_decoder(lp_ac_video_decoder pDecoder)
|
void ac_free_video_decoder(lp_ac_video_decoder pDecoder)
|
||||||
{
|
{
|
||||||
if (pDecoder) {
|
if (pDecoder) {
|
||||||
av_free(pDecoder->pFrame);
|
av_frame_free(&(pDecoder->pFrame));
|
||||||
av_free(pDecoder->pFrameRGB);
|
av_frame_free(&(pDecoder->pFrameRGB));
|
||||||
sws_freeContext(pDecoder->pSwsCtx);
|
sws_freeContext(pDecoder->pSwsCtx);
|
||||||
avcodec_free_context(&pDecoder->pCodecCtx);
|
avcodec_free_context(&pDecoder->pCodecCtx);
|
||||||
av_free(pDecoder->decoder.pBuffer);
|
av_free(pDecoder->decoder.pBuffer);
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ namespace Vocaluxe.Screens
|
|||||||
private int _Round;
|
private int _Round;
|
||||||
private int _Pos;
|
private int _Pos;
|
||||||
private bool _IsDuet;
|
private bool _IsDuet;
|
||||||
|
private bool _FromScreenSong = false;
|
||||||
|
|
||||||
public override EMusicType CurrentMusicType
|
public override EMusicType CurrentMusicType
|
||||||
{
|
{
|
||||||
@@ -113,10 +114,12 @@ namespace Vocaluxe.Screens
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Down:
|
case Keys.Down:
|
||||||
|
if (!_FromScreenSong)
|
||||||
_ChangePos(1);
|
_ChangePos(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Up:
|
case Keys.Up:
|
||||||
|
if (!_FromScreenSong)
|
||||||
_ChangePos(-1);
|
_ChangePos(-1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -234,6 +237,29 @@ namespace Vocaluxe.Screens
|
|||||||
{
|
{
|
||||||
_Pos = 0;
|
_Pos = 0;
|
||||||
int rounds = CGame.NumRounds;
|
int rounds = CGame.NumRounds;
|
||||||
|
|
||||||
|
if (rounds == 0)
|
||||||
|
{
|
||||||
|
_FromScreenSong = true;
|
||||||
|
_Round = (int)EGameMode.TR_GAMEMODE_NORMAL;
|
||||||
|
_Scores = new List<SDBScoreEntry>[4];
|
||||||
|
int songID = CScreenSong.getSelectedSongID();
|
||||||
|
EHighscoreStyle style = CBase.Config.GetHighscoreStyle();
|
||||||
|
bool foundHighscoreEntries = false;
|
||||||
|
|
||||||
|
for (int gameModeNum = 0; gameModeNum < 4; gameModeNum++)
|
||||||
|
{
|
||||||
|
_Scores[gameModeNum] = CDataBase.LoadScore(songID, (EGameMode)gameModeNum, style);
|
||||||
|
if (!foundHighscoreEntries && _Scores[gameModeNum].Count > 0)
|
||||||
|
{
|
||||||
|
_Round = gameModeNum;
|
||||||
|
foundHighscoreEntries = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_FromScreenSong = false;
|
||||||
_Scores = new List<SDBScoreEntry>[rounds];
|
_Scores = new List<SDBScoreEntry>[rounds];
|
||||||
for (int round = 0; round < rounds; round++)
|
for (int round = 0; round < rounds; round++)
|
||||||
{
|
{
|
||||||
@@ -243,20 +269,27 @@ namespace Vocaluxe.Screens
|
|||||||
_Scores[round] = CDataBase.LoadScore(songID, gameMode, style);
|
_Scores[round] = CDataBase.LoadScore(songID, gameMode, style);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void _UpdateRound()
|
private void _UpdateRound()
|
||||||
{
|
{
|
||||||
_IsDuet = false;
|
_IsDuet = false;
|
||||||
CPoints points = CGame.GetPoints();
|
CPoints points = CGame.GetPoints();
|
||||||
CSong song = CGame.GetSong(_Round);
|
|
||||||
|
CSong song;
|
||||||
|
if (_FromScreenSong)
|
||||||
|
song = CSongs.GetSong(CScreenSong.getSelectedSongID());
|
||||||
|
else
|
||||||
|
song = CGame.GetSong(_Round);
|
||||||
|
|
||||||
if (song == null)
|
if (song == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_Texts[_TextSongName].Text = song.Artist + " - " + song.Title;
|
_Texts[_TextSongName].Text = song.Artist + " - " + song.Title;
|
||||||
if (points.NumRounds > 1)
|
if (points != null && !_FromScreenSong && points.NumRounds > 1)
|
||||||
_Texts[_TextSongName].Text += " (" + (_Round + 1) + "/" + points.NumRounds + ")";
|
_Texts[_TextSongName].Text += " (" + (_Round + 1) + "/" + points.NumRounds + ")";
|
||||||
|
|
||||||
switch (CGame.GetGameMode(_Round))
|
switch ((_FromScreenSong ? (EGameMode)_Round : CGame.GetGameMode(_Round)))
|
||||||
{
|
{
|
||||||
case EGameMode.TR_GAMEMODE_NORMAL:
|
case EGameMode.TR_GAMEMODE_NORMAL:
|
||||||
_Texts[_TextSongMode].Text = "TR_GAMEMODE_NORMAL";
|
_Texts[_TextSongMode].Text = "TR_GAMEMODE_NORMAL";
|
||||||
@@ -295,10 +328,21 @@ namespace Vocaluxe.Screens
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void _ChangeRound(int num)
|
private void _ChangeRound(int num)
|
||||||
|
{
|
||||||
|
if (_FromScreenSong)
|
||||||
|
{
|
||||||
|
if (_Round == (int)EGameMode.TR_GAMEMODE_SHORTSONG)
|
||||||
|
_Round = (int)EGameMode.TR_GAMEMODE_NORMAL;
|
||||||
|
else
|
||||||
|
++_Round;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
CPoints points = CGame.GetPoints();
|
CPoints points = CGame.GetPoints();
|
||||||
_Round += num;
|
_Round += num;
|
||||||
_Round = _Round.Clamp(0, points.NumRounds - 1);
|
_Round = _Round.Clamp(0, points.NumRounds - 1);
|
||||||
|
}
|
||||||
|
|
||||||
_UpdateRound();
|
_UpdateRound();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+131
-35
@@ -1,4 +1,4 @@
|
|||||||
#region license
|
#region license
|
||||||
// This file is part of Vocaluxe.
|
// This file is part of Vocaluxe.
|
||||||
//
|
//
|
||||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||||
@@ -21,6 +21,7 @@ using System.Diagnostics;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Timers;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Vocaluxe.Base;
|
using Vocaluxe.Base;
|
||||||
using Vocaluxe.Base.Fonts;
|
using Vocaluxe.Base.Fonts;
|
||||||
@@ -30,6 +31,7 @@ using VocaluxeLib.Draw;
|
|||||||
using VocaluxeLib.Log;
|
using VocaluxeLib.Log;
|
||||||
using VocaluxeLib.Menu;
|
using VocaluxeLib.Menu;
|
||||||
using VocaluxeLib.Menu.SingNotes;
|
using VocaluxeLib.Menu.SingNotes;
|
||||||
|
using VocaluxeLib.PartyModes;
|
||||||
using VocaluxeLib.Songs;
|
using VocaluxeLib.Songs;
|
||||||
|
|
||||||
namespace Vocaluxe.Screens
|
namespace Vocaluxe.Screens
|
||||||
@@ -39,7 +41,7 @@ namespace Vocaluxe.Screens
|
|||||||
// Version number for theme files. Increment it, if you've changed something on the theme files!
|
// Version number for theme files. Increment it, if you've changed something on the theme files!
|
||||||
protected override int _ScreenVersion
|
protected override int _ScreenVersion
|
||||||
{
|
{
|
||||||
get { return 9; }
|
get { return 10; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private struct STimeRect
|
private struct STimeRect
|
||||||
@@ -49,6 +51,7 @@ namespace Vocaluxe.Screens
|
|||||||
public float EndBeat;
|
public float EndBeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private const string _TextShortInfoTop = "TextShortInfoTop";
|
||||||
private const string _TextSongName = "TextSongName";
|
private const string _TextSongName = "TextSongName";
|
||||||
private const string _TextTime = "TextTime";
|
private const string _TextTime = "TextTime";
|
||||||
private const string _TextDuetName1 = "TextDuetName1";
|
private const string _TextDuetName1 = "TextDuetName1";
|
||||||
@@ -58,6 +61,7 @@ namespace Vocaluxe.Screens
|
|||||||
private string[,,] _TextNames;
|
private string[,,] _TextNames;
|
||||||
private List<string> _TextsPause;
|
private List<string> _TextsPause;
|
||||||
|
|
||||||
|
private const string _StaticShortInfoTop = "StaticShortInfoTop";
|
||||||
private const string _StaticSongText = "StaticSongText";
|
private const string _StaticSongText = "StaticSongText";
|
||||||
private const string _StaticLyrics = "StaticLyrics";
|
private const string _StaticLyrics = "StaticLyrics";
|
||||||
private const string _StaticLyricsDuet = "StaticLyricsDuet";
|
private const string _StaticLyricsDuet = "StaticLyricsDuet";
|
||||||
@@ -112,7 +116,7 @@ namespace Vocaluxe.Screens
|
|||||||
private float _Length = -1f;
|
private float _Length = -1f;
|
||||||
|
|
||||||
private CVideoStream _CurrentVideo;
|
private CVideoStream _CurrentVideo;
|
||||||
private EAspect _VideoAspect = EAspect.Crop;
|
private EAspect _VideoAspect = EAspect.Automatic;
|
||||||
private CTextureRef _CurrentWebcamFrameTexture;
|
private CTextureRef _CurrentWebcamFrameTexture;
|
||||||
private CTextureRef _Background;
|
private CTextureRef _Background;
|
||||||
|
|
||||||
@@ -123,6 +127,7 @@ namespace Vocaluxe.Screens
|
|||||||
private float _RemainingTimeToFirstNote;
|
private float _RemainingTimeToFirstNote;
|
||||||
private float _TimeToFirstNoteDuet;
|
private float _TimeToFirstNoteDuet;
|
||||||
private float _RemainingTimeToFirstNoteDuet;
|
private float _RemainingTimeToFirstNoteDuet;
|
||||||
|
private float _TimeShowSongTextTotal;
|
||||||
|
|
||||||
private Stopwatch _TimerSongText;
|
private Stopwatch _TimerSongText;
|
||||||
private Stopwatch _TimerDuetText1;
|
private Stopwatch _TimerDuetText1;
|
||||||
@@ -132,6 +137,9 @@ namespace Vocaluxe.Screens
|
|||||||
private bool _Webcam;
|
private bool _Webcam;
|
||||||
|
|
||||||
private CBackground _SlideShow;
|
private CBackground _SlideShow;
|
||||||
|
private SScreenSongOptions _Sso;
|
||||||
|
|
||||||
|
private System.Timers.Timer _TimerShortInfoText;
|
||||||
|
|
||||||
public override EMusicType CurrentMusicType
|
public override EMusicType CurrentMusicType
|
||||||
{
|
{
|
||||||
@@ -142,12 +150,13 @@ namespace Vocaluxe.Screens
|
|||||||
{
|
{
|
||||||
base.Init();
|
base.Init();
|
||||||
|
|
||||||
var texts = new List<string> { _TextSongName, _TextTime, _TextDuetName1, _TextDuetName2, _TextMedleyCountdown };
|
var texts = new List<string> { _TextShortInfoTop, _TextSongName, _TextTime, _TextDuetName1, _TextDuetName2, _TextMedleyCountdown };
|
||||||
_BuildTextStrings(texts);
|
_BuildTextStrings(texts);
|
||||||
_ThemeTexts = texts.ToArray();
|
_ThemeTexts = texts.ToArray();
|
||||||
|
|
||||||
var statics = new List<string>
|
var statics = new List<string>
|
||||||
{
|
{
|
||||||
|
_StaticShortInfoTop,
|
||||||
_StaticSongText,
|
_StaticSongText,
|
||||||
_StaticLyrics,
|
_StaticLyrics,
|
||||||
_StaticLyricsDuet,
|
_StaticLyricsDuet,
|
||||||
@@ -181,6 +190,25 @@ namespace Vocaluxe.Screens
|
|||||||
_TimerSongText = new Stopwatch();
|
_TimerSongText = new Stopwatch();
|
||||||
_TimerDuetText1 = new Stopwatch();
|
_TimerDuetText1 = new Stopwatch();
|
||||||
_TimerDuetText2 = new Stopwatch();
|
_TimerDuetText2 = new Stopwatch();
|
||||||
|
|
||||||
|
_TimerShortInfoText = new System.Timers.Timer(5000);
|
||||||
|
_TimerShortInfoText.AutoReset = false;
|
||||||
|
_TimerShortInfoText.Elapsed += OnTimedEventShortInfoText;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTimedEventShortInfoText(Object source, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
_Statics[_StaticShortInfoTop].Visible = false;
|
||||||
|
_Texts[_TextShortInfoTop].Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _ShowInfoText(String text)
|
||||||
|
{
|
||||||
|
_Texts[_TextShortInfoTop].Text = text;
|
||||||
|
_Statics[_StaticShortInfoTop].Visible = true;
|
||||||
|
_Texts[_TextShortInfoTop].Visible = true;
|
||||||
|
_TimerShortInfoText.Stop();
|
||||||
|
_TimerShortInfoText.Enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void LoadTheme(string xmlPath)
|
public override void LoadTheme(string xmlPath)
|
||||||
@@ -245,6 +273,8 @@ namespace Vocaluxe.Screens
|
|||||||
if (keyEvent.ModCtrl)
|
if (keyEvent.ModCtrl)
|
||||||
_NextSong();
|
_NextSong();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
_ShowInfoText(CBase.Language.Translate("TR_SCREENSING_NOMORESONGS"));
|
||||||
break;
|
break;
|
||||||
case Keys.W:
|
case Keys.W:
|
||||||
if (CWebcam.IsDeviceAvailable())
|
if (CWebcam.IsDeviceAvailable())
|
||||||
@@ -255,6 +285,8 @@ namespace Vocaluxe.Screens
|
|||||||
else
|
else
|
||||||
CWebcam.Stop();
|
CWebcam.Stop();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
_ShowInfoText(CBase.Language.Translate("TR_SCREENSING_NOWEBCAM"));
|
||||||
break;
|
break;
|
||||||
case Keys.Enter:
|
case Keys.Enter:
|
||||||
if (_Pause)
|
if (_Pause)
|
||||||
@@ -264,9 +296,15 @@ namespace Vocaluxe.Screens
|
|||||||
if (_Buttons[_ButtonCancel].Selected)
|
if (_Buttons[_ButtonCancel].Selected)
|
||||||
_Stop();
|
_Stop();
|
||||||
if (_Buttons[_ButtonRestartGame].Selected)
|
if (_Buttons[_ButtonRestartGame].Selected)
|
||||||
|
{
|
||||||
_RestartGame();
|
_RestartGame();
|
||||||
|
_SetPause(false);
|
||||||
|
}
|
||||||
if (_Buttons[_ButtonRestartRound].Selected)
|
if (_Buttons[_ButtonRestartRound].Selected)
|
||||||
|
{
|
||||||
_RestartRound();
|
_RestartRound();
|
||||||
|
_SetPause(false);
|
||||||
|
}
|
||||||
if (_Buttons[_ButtonSkip].Selected)
|
if (_Buttons[_ButtonSkip].Selected)
|
||||||
{
|
{
|
||||||
_NextSong();
|
_NextSong();
|
||||||
@@ -284,9 +322,45 @@ namespace Vocaluxe.Screens
|
|||||||
CSong song = CGame.GetSong();
|
CSong song = CGame.GetSong();
|
||||||
song.VideoAspect = _VideoAspect;
|
song.VideoAspect = _VideoAspect;
|
||||||
|
|
||||||
|
_ShowInfoText(CBase.Language.Translate("TR_SCREENSING_ASPECTRATIO").Replace("%a", _VideoAspect.ToString()));
|
||||||
|
|
||||||
if (CConfig.Config.Debug.SaveModifiedSongs == EOffOn.TR_CONFIG_ON)
|
if (CConfig.Config.Debug.SaveModifiedSongs == EOffOn.TR_CONFIG_ON)
|
||||||
song.Save();
|
song.Save();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Restart Round and reload song file header
|
||||||
|
case Keys.R:
|
||||||
|
if (keyEvent.Mod == EModifier.Ctrl && _Pause)
|
||||||
|
{
|
||||||
|
_SetPause(false);
|
||||||
|
_RestartRound();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Restart Round and reload song file header
|
||||||
|
case Keys.F5:
|
||||||
|
if (_Pause)
|
||||||
|
{
|
||||||
|
_SetPause(false);
|
||||||
|
_RestartRound();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Skip 10/30 seconds
|
||||||
|
case Keys.Right:
|
||||||
|
if ((keyEvent.Mod == EModifier.Shift || keyEvent.Mod == EModifier.Ctrl) && !_Pause && !_Sso.Selection.PartyMode)
|
||||||
|
{
|
||||||
|
if (_TimerSongText.IsRunning)
|
||||||
|
_TimerSongText.Stop();
|
||||||
|
|
||||||
|
float newTime = _CurrentTime + (keyEvent.Mod == EModifier.Shift ? 10f : 30f);
|
||||||
|
if (CSound.GetLength(_CurrentStream) < newTime)
|
||||||
|
newTime = CSound.GetLength(_CurrentStream) - 1f;
|
||||||
|
CSound.SetPosition(_CurrentStream, newTime);
|
||||||
|
|
||||||
|
_ShowInfoText(CBase.Language.Translate("TR_SCREENSING_SKIPPEDSECONDS").Replace("%s", (keyEvent.Mod == EModifier.Shift ? "10" : "30")));
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,6 +430,7 @@ namespace Vocaluxe.Screens
|
|||||||
_SetPause(false);
|
_SetPause(false);
|
||||||
|
|
||||||
_TimeRects.Clear();
|
_TimeRects.Clear();
|
||||||
|
_Sso = CParty.GetSongSelectionOptions();
|
||||||
|
|
||||||
_SingNotes[_SingBars].Init(0);
|
_SingNotes[_SingBars].Init(0);
|
||||||
_AssignPlayerElements();
|
_AssignPlayerElements();
|
||||||
@@ -463,17 +538,11 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
if (alpha.Length > 2)
|
if (alpha.Length > 2)
|
||||||
{
|
{
|
||||||
_Lyrics[_LyricMainDuet].Alpha = alpha[0];
|
_Lyrics[_LyricMainDuet].Alpha = alpha[2];
|
||||||
_Lyrics[_LyricSubDuet].Alpha = alpha[1];
|
_Lyrics[_LyricSubDuet].Alpha = alpha[3];
|
||||||
|
|
||||||
_Statics[_StaticLyricsDuet].Alpha = alpha[0];
|
_Statics[_StaticLyricsDuet].Alpha = alpha[2];
|
||||||
_Statics[_StaticLyricHelperDuet].Alpha = alpha[0];
|
_Statics[_StaticLyricHelperDuet].Alpha = alpha[2];
|
||||||
|
|
||||||
_Lyrics[_LyricMain].Alpha = alpha[2];
|
|
||||||
_Lyrics[_LyricSub].Alpha = alpha[3];
|
|
||||||
|
|
||||||
_Statics[_StaticLyrics].Alpha = alpha[2];
|
|
||||||
_Statics[_StaticLyricHelper].Alpha = alpha[2];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -532,7 +601,7 @@ namespace Vocaluxe.Screens
|
|||||||
_SingNotes[_SingBars].PlayerNotes[j].SetLine(nr);
|
_SingNotes[_SingBars].PlayerNotes[j].SetLine(nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == 0 && !song.IsDuet || i == 1 && song.IsDuet)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
_Lyrics[_LyricMain].SetLine(lines[nr]);
|
_Lyrics[_LyricMain].SetLine(lines[nr]);
|
||||||
_Lyrics[_LyricMainTop].SetLine(lines[nr]);
|
_Lyrics[_LyricMainTop].SetLine(lines[nr]);
|
||||||
@@ -550,7 +619,7 @@ namespace Vocaluxe.Screens
|
|||||||
_Lyrics[_LyricSubTop].Clear();
|
_Lyrics[_LyricSubTop].Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == 0 && song.IsDuet)
|
if (i == 1 && song.IsDuet)
|
||||||
{
|
{
|
||||||
_Lyrics[_LyricMainDuet].SetLine(lines[nr]);
|
_Lyrics[_LyricMainDuet].SetLine(lines[nr]);
|
||||||
_TimeToFirstNoteDuet = CGame.GetTimeFromBeats(lines[nr].FirstNoteBeat - lines[nr].StartBeat, song.BPM);
|
_TimeToFirstNoteDuet = CGame.GetTimeFromBeats(lines[nr].FirstNoteBeat - lines[nr].StartBeat, song.BPM);
|
||||||
@@ -564,7 +633,7 @@ namespace Vocaluxe.Screens
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (i == 0 && !song.IsDuet || i == 1 && song.IsDuet)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
_Lyrics[_LyricMain].Clear();
|
_Lyrics[_LyricMain].Clear();
|
||||||
_Lyrics[_LyricSub].Clear();
|
_Lyrics[_LyricSub].Clear();
|
||||||
@@ -573,7 +642,7 @@ namespace Vocaluxe.Screens
|
|||||||
_TimeToFirstNote = 0f;
|
_TimeToFirstNote = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == 0 && song.IsDuet)
|
if (i == 1 && song.IsDuet)
|
||||||
{
|
{
|
||||||
_Lyrics[_LyricMainDuet].Clear();
|
_Lyrics[_LyricMainDuet].Clear();
|
||||||
_Lyrics[_LyricSubDuet].Clear();
|
_Lyrics[_LyricSubDuet].Clear();
|
||||||
@@ -610,23 +679,23 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
private void _UpdateSongText()
|
private void _UpdateSongText()
|
||||||
{
|
{
|
||||||
if (_TimerSongText.IsRunning && !_Lyrics[_LyricMainDuet].Visible && !_Lyrics[_LyricMainTop].Visible)
|
if (_TimerSongText.IsRunning)
|
||||||
{
|
{
|
||||||
float t = _TimerSongText.ElapsedMilliseconds / 1000f;
|
float t = _TimerSongText.ElapsedMilliseconds / 1000f;
|
||||||
if (t < 10f)
|
if (t < _TimeShowSongTextTotal)
|
||||||
{
|
{
|
||||||
_Statics[_StaticSongText].Visible = true;
|
_Statics[_StaticSongText].Visible = true;
|
||||||
_Texts[_TextSongName].Visible = true;
|
_Texts[_TextSongName].Visible = true;
|
||||||
|
|
||||||
if (t < 7f)
|
if (t < (_TimeShowSongTextTotal - 3f))
|
||||||
{
|
{
|
||||||
_Statics[_StaticSongText].Color.A = 1f;
|
_Statics[_StaticSongText].Color.A = 1f;
|
||||||
_Texts[_TextSongName].Color.A = 1f;
|
_Texts[_TextSongName].Color.A = 1f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_Statics[_StaticSongText].Color.A = (10f - t) / 3f;
|
_Statics[_StaticSongText].Color.A = (_TimeShowSongTextTotal - t) / 3f;
|
||||||
_Texts[_TextSongName].Color.A = (10f - t) / 3f;
|
_Texts[_TextSongName].Color.A = (_TimeShowSongTextTotal - t) / 3f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -665,7 +734,7 @@ namespace Vocaluxe.Screens
|
|||||||
timer.Stop();
|
timer.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!timer.IsRunning && timer.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainDuet].Alpha > 0 && CGame.GetSong().IsDuet)
|
else if (!timer.IsRunning && timer.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainTop].Alpha > 0 && CGame.GetSong().IsDuet)
|
||||||
timer.Start();
|
timer.Start();
|
||||||
else
|
else
|
||||||
textName.Visible = false;
|
textName.Visible = false;
|
||||||
@@ -698,7 +767,7 @@ namespace Vocaluxe.Screens
|
|||||||
_TimerDuetText2.Stop();
|
_TimerDuetText2.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!_TimerDuetText2.IsRunning && _TimerDuetText2.ElapsedMilliseconds == 0 && _Lyrics[_LyricMain].Alpha > 0 && CGame.GetSong().IsDuet)
|
else if (!_TimerDuetText2.IsRunning && _TimerDuetText2.ElapsedMilliseconds == 0 && _Lyrics[_LyricMainDuet].Alpha > 0 && CGame.GetSong().IsDuet)
|
||||||
_TimerDuetText2.Start();
|
_TimerDuetText2.Start();
|
||||||
else
|
else
|
||||||
_Texts[_TextDuetName2].Visible = false;
|
_Texts[_TextDuetName2].Visible = false;
|
||||||
@@ -794,18 +863,21 @@ namespace Vocaluxe.Screens
|
|||||||
if (_CurrentVideo != null && CConfig.Config.Video.VideosInSongs == EOffOn.TR_CONFIG_ON && !_Webcam)
|
if (_CurrentVideo != null && CConfig.Config.Video.VideosInSongs == EOffOn.TR_CONFIG_ON && !_Webcam)
|
||||||
{
|
{
|
||||||
background = _CurrentVideo.Texture;
|
background = _CurrentVideo.Texture;
|
||||||
aspect = _VideoAspect;
|
|
||||||
}
|
}
|
||||||
else if (_Webcam)
|
else if (_Webcam)
|
||||||
{
|
{
|
||||||
background = _CurrentWebcamFrameTexture;
|
background = _CurrentWebcamFrameTexture;
|
||||||
aspect = _VideoAspect;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
background = _Background;
|
background = _Background;
|
||||||
if (background != null)
|
if (background != null)
|
||||||
{
|
{
|
||||||
SRectF bounds = CSettings.RenderRect;
|
SRectF bounds = CSettings.RenderRect;
|
||||||
|
|
||||||
|
if (_VideoAspect == EAspect.Automatic)
|
||||||
|
_VideoAspect = ((background.OrigAspect <= 1.5 || background.OrigAspect >= 1.9) ? EAspect.LetterBox : EAspect.Crop);
|
||||||
|
aspect = _VideoAspect;
|
||||||
|
|
||||||
SRectF rect = CHelper.FitInBounds(bounds, background.OrigAspect, aspect);
|
SRectF rect = CHelper.FitInBounds(bounds, background.OrigAspect, aspect);
|
||||||
CDraw.DrawTexture(background, rect, background.Color, bounds);
|
CDraw.DrawTexture(background, rect, background.Color, bounds);
|
||||||
}
|
}
|
||||||
@@ -876,7 +948,7 @@ namespace Vocaluxe.Screens
|
|||||||
_Statics[_StaticLyricHelperTop].Color.R,
|
_Statics[_StaticLyricHelperTop].Color.R,
|
||||||
_Statics[_StaticLyricHelperTop].Color.G,
|
_Statics[_StaticLyricHelperTop].Color.G,
|
||||||
_Statics[_StaticLyricHelperTop].Color.B,
|
_Statics[_StaticLyricHelperTop].Color.B,
|
||||||
_Statics[_StaticLyricHelperTop].Color.A * _Statics[_StaticLyricHelper].Alpha * alpha);
|
_Statics[_StaticLyricHelperTop].Color.A * _Statics[_StaticLyricHelperTop].Alpha * alpha);
|
||||||
|
|
||||||
float distance = _Lyrics[_LyricMainTop].GetCurrentLyricPosX() - rect.X - rect.W;
|
float distance = _Lyrics[_LyricMainTop].GetCurrentLyricPosX() - rect.X - rect.W;
|
||||||
CDraw.DrawTexture(_Statics[_StaticLyricHelperTop].Texture,
|
CDraw.DrawTexture(_Statics[_StaticLyricHelperTop].Texture,
|
||||||
@@ -965,7 +1037,7 @@ namespace Vocaluxe.Screens
|
|||||||
_CloseSong();
|
_CloseSong();
|
||||||
|
|
||||||
CGame.ResetPlayer();
|
CGame.ResetPlayer();
|
||||||
_LoadCurrentSong();
|
_LoadCurrentSong(false);
|
||||||
|
|
||||||
_StartSong();
|
_StartSong();
|
||||||
}
|
}
|
||||||
@@ -1045,7 +1117,7 @@ namespace Vocaluxe.Screens
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prepare streams and screen for current song.
|
/// Prepare streams and screen for current song.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void _LoadCurrentSong()
|
private void _LoadCurrentSong(bool reloadNotes = true)
|
||||||
{
|
{
|
||||||
if (CGame.IsFinished())
|
if (CGame.IsFinished())
|
||||||
{
|
{
|
||||||
@@ -1061,6 +1133,9 @@ namespace Vocaluxe.Screens
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_Sso.Selection.PartyMode && (CGame.GameMode == EGameMode.TR_GAMEMODE_NORMAL || CGame.GameMode == EGameMode.TR_GAMEMODE_DUET))
|
||||||
|
song.ReloadSong(reloadNotes);
|
||||||
|
|
||||||
string songname = song.Artist + " - " + song.Title;
|
string songname = song.Artist + " - " + song.Title;
|
||||||
int rounds = CGame.GetNumSongs();
|
int rounds = CGame.GetNumSongs();
|
||||||
if (rounds > 1)
|
if (rounds > 1)
|
||||||
@@ -1083,11 +1158,11 @@ namespace Vocaluxe.Screens
|
|||||||
voiceAssignments[i] = CGame.Players[i].VoiceNr;
|
voiceAssignments[i] = CGame.Players[i].VoiceNr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_VideoAspect = song.VideoAspect;
|
||||||
if (!String.IsNullOrEmpty(song.VideoFileName))
|
if (!String.IsNullOrEmpty(song.VideoFileName))
|
||||||
{
|
{
|
||||||
_CurrentVideo = CVideo.Load(Path.Combine(song.Folder, song.VideoFileName));
|
_CurrentVideo = CVideo.Load(Path.Combine(song.Folder, song.VideoFileName));
|
||||||
CVideo.Skip(_CurrentVideo, song.Start, song.VideoGap);
|
CVideo.Skip(_CurrentVideo, song.Start, song.VideoGap);
|
||||||
_VideoAspect = song.VideoAspect;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CDraw.RemoveTexture(ref _Background);
|
CDraw.RemoveTexture(ref _Background);
|
||||||
@@ -1145,7 +1220,25 @@ namespace Vocaluxe.Screens
|
|||||||
_TimerDuetText1.Reset();
|
_TimerDuetText1.Reset();
|
||||||
_TimerDuetText2.Reset();
|
_TimerDuetText2.Reset();
|
||||||
|
|
||||||
if (!song.IsDuet)
|
// Getting the real start of the first line from the first voice, no other voices are on top since #454.
|
||||||
|
// Needed for displaying song name on duet game mode or lyric on top settings (implemented with #455).
|
||||||
|
CVoice voice = song.Notes.GetVoice(0); // As long as only voice 0 is on top (no matter if duet or other modes).
|
||||||
|
CSongLine[] lines = voice.Lines;
|
||||||
|
float realGap = CGame.GetTimeFromBeats(lines[0].FirstNoteBeat, song.BPM) + (song.Gap - song.Start);
|
||||||
|
_TimeShowSongTextTotal = 10f;
|
||||||
|
if (_Lyrics[_LyricMainDuet].Visible || _Lyrics[_LyricMainTop].Visible)
|
||||||
|
{
|
||||||
|
if (realGap < 11f)
|
||||||
|
{
|
||||||
|
_TimeShowSongTextTotal = 0;
|
||||||
|
}
|
||||||
|
else if (realGap < 17f)
|
||||||
|
{
|
||||||
|
_TimeShowSongTextTotal = realGap - 7f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_TimeShowSongTextTotal > 0)
|
||||||
_TimerSongText.Start();
|
_TimerSongText.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1173,6 +1266,7 @@ namespace Vocaluxe.Screens
|
|||||||
_Lyrics[_LyricSubDuet].Clear();
|
_Lyrics[_LyricSubDuet].Clear();
|
||||||
_Lyrics[_LyricMainTop].Clear();
|
_Lyrics[_LyricMainTop].Clear();
|
||||||
_Lyrics[_LyricSubTop].Clear();
|
_Lyrics[_LyricSubTop].Clear();
|
||||||
|
_Texts[_TextShortInfoTop].Text = String.Empty;
|
||||||
_Texts[_TextSongName].Text = String.Empty;
|
_Texts[_TextSongName].Text = String.Empty;
|
||||||
_Texts[_TextDuetName1].Text = String.Empty;
|
_Texts[_TextDuetName1].Text = String.Empty;
|
||||||
_Texts[_TextDuetName2].Text = String.Empty;
|
_Texts[_TextDuetName2].Text = String.Empty;
|
||||||
@@ -1196,8 +1290,8 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
if (CGame.GetSong() != null && CGame.GetSong().IsDuet)
|
if (CGame.GetSong() != null && CGame.GetSong().IsDuet)
|
||||||
{
|
{
|
||||||
bottomLyricsVisible = true;
|
bottomLyricsVisible = false;
|
||||||
topLyricsVisible = false;
|
topLyricsVisible = true;
|
||||||
duetLyricsVisible = true;
|
duetLyricsVisible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1223,7 +1317,9 @@ namespace Vocaluxe.Screens
|
|||||||
_Lyrics[_LyricMainDuet].Visible = false;
|
_Lyrics[_LyricMainDuet].Visible = false;
|
||||||
_Lyrics[_LyricSubDuet].Visible = false;
|
_Lyrics[_LyricSubDuet].Visible = false;
|
||||||
|
|
||||||
|
_Statics[_StaticShortInfoTop].Visible = false;
|
||||||
_Statics[_StaticSongText].Visible = false;
|
_Statics[_StaticSongText].Visible = false;
|
||||||
|
_Texts[_TextShortInfoTop].Visible = false;
|
||||||
_Texts[_TextSongName].Visible = false;
|
_Texts[_TextSongName].Visible = false;
|
||||||
_Texts[_TextDuetName1].Visible = false;
|
_Texts[_TextDuetName1].Visible = false;
|
||||||
_Texts[_TextDuetName2].Visible = false;
|
_Texts[_TextDuetName2].Visible = false;
|
||||||
@@ -1399,7 +1495,7 @@ namespace Vocaluxe.Screens
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sub
|
// sub
|
||||||
if (currentLineSub < lines.Length - 2)
|
if ((currentLineSub + 1) < lines.Length)
|
||||||
{
|
{
|
||||||
float diff = CGame.GetTimeFromBeats(lines[currentLineSub + 1].FirstNoteBeat, song.BPM) - currentTime;
|
float diff = CGame.GetTimeFromBeats(lines[currentLineSub + 1].FirstNoteBeat, song.BPM) - currentTime;
|
||||||
|
|
||||||
|
|||||||
+214
-45
@@ -1,4 +1,4 @@
|
|||||||
#region license
|
#region license
|
||||||
// This file is part of Vocaluxe.
|
// This file is part of Vocaluxe.
|
||||||
//
|
//
|
||||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||||
@@ -19,6 +19,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Timers;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Vocaluxe.Base;
|
using Vocaluxe.Base;
|
||||||
using VocaluxeLib;
|
using VocaluxeLib;
|
||||||
@@ -42,14 +43,18 @@ namespace Vocaluxe.Screens
|
|||||||
// Version number for theme files. Increment it, if you've changed something on the theme files!
|
// Version number for theme files. Increment it, if you've changed something on the theme files!
|
||||||
protected override int _ScreenVersion
|
protected override int _ScreenVersion
|
||||||
{
|
{
|
||||||
get { return 6; }
|
get { return 10; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private const string _TextCategory = "TextCategory";
|
private const string _TextCategory = "TextCategory";
|
||||||
private const string _TextSelection = "TextSelection";
|
private const string _TextSelection = "TextSelection";
|
||||||
private const string _TextSearchBarTitle = "TextSearchBarTitle";
|
private const string _TextSearchBarTitle = "TextSearchBarTitle";
|
||||||
private const string _TextSearchBar = "TextSearchBar";
|
private const string _TextSearchBar = "TextSearchBar";
|
||||||
|
private const string _TextHelpBar = "TextHelpBar";
|
||||||
|
private const string _TextHelpBarSearch = "TextHelpBarSearch";
|
||||||
|
private const string _TextHelpBarParty = "TextHelpBarParty";
|
||||||
private const string _TextOptionsTitle = "TextOptionsTitle";
|
private const string _TextOptionsTitle = "TextOptionsTitle";
|
||||||
|
private const string _TextShortInfoTop = "TextShortInfoTop";
|
||||||
|
|
||||||
private const string _ButtonOpenOptions = "ButtonOpenOptions";
|
private const string _ButtonOpenOptions = "ButtonOpenOptions";
|
||||||
private const string _ButtonOptionsSing = "ButtonOptionsSing";
|
private const string _ButtonOptionsSing = "ButtonOptionsSing";
|
||||||
@@ -63,6 +68,7 @@ namespace Vocaluxe.Screens
|
|||||||
private const string _ButtonOptionsRandomMedley = "ButtonOptionsRandomMedley";
|
private const string _ButtonOptionsRandomMedley = "ButtonOptionsRandomMedley";
|
||||||
private const string _ButtonOptionsStartMedley = "ButtonOptionsStartMedley";
|
private const string _ButtonOptionsStartMedley = "ButtonOptionsStartMedley";
|
||||||
private const string _ButtonStart = "ButtonStart";
|
private const string _ButtonStart = "ButtonStart";
|
||||||
|
private const string _ButtonOptionsHighscore = "ButtonOptionsHighscore";
|
||||||
|
|
||||||
private const string _SelectSlideOptionsMode = "SelectSlideOptionsMode";
|
private const string _SelectSlideOptionsMode = "SelectSlideOptionsMode";
|
||||||
private const string _SelectSlideOptionsPlaylistAdd = "SelectSlideOptionsPlaylistAdd";
|
private const string _SelectSlideOptionsPlaylistAdd = "SelectSlideOptionsPlaylistAdd";
|
||||||
@@ -71,12 +77,16 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
private const string _StaticSearchBar = "StaticSearchBar";
|
private const string _StaticSearchBar = "StaticSearchBar";
|
||||||
private const string _StaticOptionsBG = "StaticOptionsBG";
|
private const string _StaticOptionsBG = "StaticOptionsBG";
|
||||||
|
private const string _StaticShortInfoTop = "StaticShortInfoTop";
|
||||||
private const string _SongMenuName = "SongMenu";
|
private const string _SongMenuName = "SongMenu";
|
||||||
private const string _PlaylistName = "Playlist";
|
private const string _PlaylistName = "Playlist";
|
||||||
|
|
||||||
private string _SearchText = String.Empty;
|
private string _SearchText = String.Empty;
|
||||||
private bool _SearchActive;
|
private bool _SearchActive;
|
||||||
|
|
||||||
|
private int _JumpTo_lastCharTime = 0;
|
||||||
|
private String _JumpTo_lastSearchString = "";
|
||||||
|
|
||||||
private readonly List<string> _ButtonsJoker = new List<string>();
|
private readonly List<string> _ButtonsJoker = new List<string>();
|
||||||
private readonly List<string> _TextsPlayer = new List<string>();
|
private readonly List<string> _TextsPlayer = new List<string>();
|
||||||
private ESongOptionsView _CurSongOptionsView;
|
private ESongOptionsView _CurSongOptionsView;
|
||||||
@@ -93,6 +103,20 @@ namespace Vocaluxe.Screens
|
|||||||
private ISongMenu _SongMenu;
|
private ISongMenu _SongMenu;
|
||||||
private CPlaylist _Playlist;
|
private CPlaylist _Playlist;
|
||||||
|
|
||||||
|
private System.Timers.Timer _TimerShortInfoText;
|
||||||
|
|
||||||
|
private static int _StaticSelectedSongID;
|
||||||
|
|
||||||
|
private static void setStaticSelectedSongID(int songID)
|
||||||
|
{
|
||||||
|
_StaticSelectedSongID = songID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getSelectedSongID()
|
||||||
|
{
|
||||||
|
return _StaticSelectedSongID;
|
||||||
|
}
|
||||||
|
|
||||||
public override EMusicType CurrentMusicType
|
public override EMusicType CurrentMusicType
|
||||||
{
|
{
|
||||||
get { return CSongs.IsInCategory ? EMusicType.Preview : EMusicType.Background; }
|
get { return CSongs.IsInCategory ? EMusicType.Preview : EMusicType.Background; }
|
||||||
@@ -124,6 +148,7 @@ namespace Vocaluxe.Screens
|
|||||||
blist.Add(_ButtonStart);
|
blist.Add(_ButtonStart);
|
||||||
blist.Add(_ButtonOptionsRandomMedley);
|
blist.Add(_ButtonOptionsRandomMedley);
|
||||||
blist.Add(_ButtonOptionsStartMedley);
|
blist.Add(_ButtonOptionsStartMedley);
|
||||||
|
blist.Add(_ButtonOptionsHighscore);
|
||||||
|
|
||||||
_TextsPlayer.Clear();
|
_TextsPlayer.Clear();
|
||||||
for (int i = 0; i < CSettings.MaxNumPlayer; i++)
|
for (int i = 0; i < CSettings.MaxNumPlayer; i++)
|
||||||
@@ -134,9 +159,13 @@ namespace Vocaluxe.Screens
|
|||||||
tlist.Add(_TextSelection);
|
tlist.Add(_TextSelection);
|
||||||
tlist.Add(_TextSearchBarTitle);
|
tlist.Add(_TextSearchBarTitle);
|
||||||
tlist.Add(_TextSearchBar);
|
tlist.Add(_TextSearchBar);
|
||||||
|
tlist.Add(_TextHelpBar);
|
||||||
|
tlist.Add(_TextHelpBarSearch);
|
||||||
|
tlist.Add(_TextHelpBarParty);
|
||||||
tlist.Add(_TextOptionsTitle);
|
tlist.Add(_TextOptionsTitle);
|
||||||
|
tlist.Add(_TextShortInfoTop);
|
||||||
|
|
||||||
_ThemeStatics = new string[] {_StaticSearchBar, _StaticOptionsBG};
|
_ThemeStatics = new string[] {_StaticSearchBar, _StaticOptionsBG, _StaticShortInfoTop};
|
||||||
_ThemeTexts = tlist.ToArray();
|
_ThemeTexts = tlist.ToArray();
|
||||||
_ThemeButtons = blist.ToArray();
|
_ThemeButtons = blist.ToArray();
|
||||||
_ThemeSelectSlides = new string[] {_SelectSlideOptionsMode, _SelectSlideOptionsPlaylistAdd, _SelectSlideOptionsPlaylistOpen, _SelectSlideOptionsNumMedleySongs};
|
_ThemeSelectSlides = new string[] {_SelectSlideOptionsMode, _SelectSlideOptionsPlaylistAdd, _SelectSlideOptionsPlaylistOpen, _SelectSlideOptionsNumMedleySongs};
|
||||||
@@ -144,6 +173,10 @@ namespace Vocaluxe.Screens
|
|||||||
_ThemePlaylists = new string[] {_PlaylistName};
|
_ThemePlaylists = new string[] {_PlaylistName};
|
||||||
|
|
||||||
_DragAndDropCover = GetNewStatic();
|
_DragAndDropCover = GetNewStatic();
|
||||||
|
|
||||||
|
_TimerShortInfoText = new System.Timers.Timer(5000);
|
||||||
|
_TimerShortInfoText.AutoReset = false;
|
||||||
|
_TimerShortInfoText.Elapsed += OnTimedEventShortInfoText;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void _OnSongMenuChanged()
|
protected override void _OnSongMenuChanged()
|
||||||
@@ -184,6 +217,11 @@ namespace Vocaluxe.Screens
|
|||||||
keyEvent.Handled = true;
|
keyEvent.Handled = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (keyEvent.Key == Keys.Enter && _Playlist.isButtonPlaylistListSelected())
|
||||||
|
{
|
||||||
|
_TogglePlaylistFilter();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Playlist selection is handled below not in base!
|
// Playlist selection is handled below not in base!
|
||||||
@@ -279,20 +317,7 @@ namespace Vocaluxe.Screens
|
|||||||
else if (!_Sso.Selection.PartyMode)
|
else if (!_Sso.Selection.PartyMode)
|
||||||
_SearchActive = true;
|
_SearchActive = true;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
if (!_SearchActive)
|
|
||||||
{
|
|
||||||
switch (keyEvent.Key)
|
|
||||||
{
|
|
||||||
case Keys.Space:
|
|
||||||
if (!_Sso.Selection.PartyMode)
|
|
||||||
_ToggleSongOptions(ESongOptionsView.General);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Keys.A:
|
|
||||||
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
|
||||||
_StartRandomAllSongs();
|
|
||||||
break;
|
|
||||||
case Keys.V:
|
case Keys.V:
|
||||||
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
||||||
_StartRandomVisibleSongs();
|
_StartRandomVisibleSongs();
|
||||||
@@ -308,8 +333,65 @@ namespace Vocaluxe.Screens
|
|||||||
_StartMedleySong(_SongMenu.GetPreviewSongNr());
|
_StartMedleySong(_SongMenu.GetPreviewSongNr());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.F:
|
case Keys.T:
|
||||||
|
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
||||||
|
{
|
||||||
|
_ToggleTabs();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.D0:
|
||||||
|
case Keys.D1:
|
||||||
|
case Keys.D2:
|
||||||
|
case Keys.D3:
|
||||||
|
case Keys.D4:
|
||||||
|
case Keys.D5:
|
||||||
|
case Keys.D6:
|
||||||
|
case Keys.D7:
|
||||||
|
case Keys.D8:
|
||||||
|
case Keys.D9:
|
||||||
|
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
||||||
|
{
|
||||||
|
int tempSortNr = -1;
|
||||||
|
int.TryParse(keyEvent.Key.ToString().Substring(1), out tempSortNr);
|
||||||
|
|
||||||
|
if (tempSortNr == 0)
|
||||||
|
tempSortNr = 10;
|
||||||
|
|
||||||
|
_ToggleSort(tempSortNr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.H:
|
||||||
|
if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode)
|
||||||
|
{
|
||||||
|
_ShowHighscore();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.L:
|
||||||
if (keyEvent.Mod == EModifier.Ctrl)
|
if (keyEvent.Mod == EModifier.Ctrl)
|
||||||
|
{
|
||||||
|
_TogglePlaylistFilter();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!_SearchActive)
|
||||||
|
{
|
||||||
|
switch (keyEvent.Key)
|
||||||
|
{
|
||||||
|
case Keys.Space:
|
||||||
|
if (!_Sso.Selection.PartyMode && !_Playlist.isPlaylistNameEditMode())
|
||||||
|
_ToggleSongOptions(ESongOptionsView.General);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.A:
|
||||||
|
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
||||||
|
_StartRandomAllSongs();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.F:
|
||||||
|
if (keyEvent.Mod == EModifier.Ctrl && !_Sso.Selection.PartyMode)
|
||||||
_SearchActive = true;
|
_SearchActive = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -390,6 +472,10 @@ namespace Vocaluxe.Screens
|
|||||||
_ToggleSongOptions(ESongOptionsView.None);
|
_ToggleSongOptions(ESongOptionsView.None);
|
||||||
_StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory);
|
_StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory);
|
||||||
}
|
}
|
||||||
|
else if (_Buttons[_ButtonOptionsHighscore].Selected)
|
||||||
|
{
|
||||||
|
_ShowHighscore();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Escape:
|
case Keys.Escape:
|
||||||
@@ -425,6 +511,11 @@ namespace Vocaluxe.Screens
|
|||||||
_SongMenu.SmallView = false;
|
_SongMenu.SmallView = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (mouseEvent.LB && _Playlist.isButtonPlaylistListSelected())
|
||||||
|
{
|
||||||
|
_TogglePlaylistFilter();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (CHelper.IsInBounds(_SongMenu.Rect, mouseEvent))
|
else if (CHelper.IsInBounds(_SongMenu.Rect, mouseEvent))
|
||||||
{
|
{
|
||||||
@@ -565,6 +656,10 @@ namespace Vocaluxe.Screens
|
|||||||
_StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory);
|
_StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (_Buttons[_ButtonOptionsHighscore].Selected)
|
||||||
|
{
|
||||||
|
_ShowHighscore();
|
||||||
|
}
|
||||||
else if (_Sso.Selection.RandomOnly && _Sso.Selection.NumJokers != null)
|
else if (_Sso.Selection.RandomOnly && _Sso.Selection.NumJokers != null)
|
||||||
{
|
{
|
||||||
if (_Buttons[_ButtonStart].Selected)
|
if (_Buttons[_ButtonStart].Selected)
|
||||||
@@ -679,6 +774,9 @@ namespace Vocaluxe.Screens
|
|||||||
_DragAndDropCover.Visible = false;
|
_DragAndDropCover.Visible = false;
|
||||||
_Playlist.DragAndDropSongID = -1;
|
_Playlist.DragAndDropSongID = -1;
|
||||||
|
|
||||||
|
_Statics[_StaticShortInfoTop].Visible = false;
|
||||||
|
_Texts[_TextShortInfoTop].Visible = false;
|
||||||
|
|
||||||
UpdateGame();
|
UpdateGame();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -727,12 +825,18 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
_Texts[_TextSearchBar].Visible = true;
|
_Texts[_TextSearchBar].Visible = true;
|
||||||
_Texts[_TextSearchBarTitle].Visible = true;
|
_Texts[_TextSearchBarTitle].Visible = true;
|
||||||
|
_Texts[_TextHelpBar].Visible = false;
|
||||||
|
_Texts[_TextHelpBarSearch].Visible = true;
|
||||||
|
_Texts[_TextHelpBarParty].Visible = false;
|
||||||
_Statics[_StaticSearchBar].Visible = true;
|
_Statics[_StaticSearchBar].Visible = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_Texts[_TextSearchBar].Visible = false;
|
_Texts[_TextSearchBar].Visible = false;
|
||||||
_Texts[_TextSearchBarTitle].Visible = false;
|
_Texts[_TextSearchBarTitle].Visible = false;
|
||||||
|
_Texts[_TextHelpBar].Visible = !_Sso.Selection.PartyMode;
|
||||||
|
_Texts[_TextHelpBarSearch].Visible = false;
|
||||||
|
_Texts[_TextHelpBarParty].Visible = _Sso.Selection.PartyMode;
|
||||||
_Statics[_StaticSearchBar].Visible = false;
|
_Statics[_StaticSearchBar].Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -782,9 +886,6 @@ namespace Vocaluxe.Screens
|
|||||||
CParty.OnSongChange(_SelectedSongID, ref _Sso);
|
CParty.OnSongChange(_SelectedSongID, ref _Sso);
|
||||||
}
|
}
|
||||||
|
|
||||||
_Sso = CParty.GetSongSelectionOptions();
|
|
||||||
|
|
||||||
|
|
||||||
if (_Sso.Selection.PartyMode)
|
if (_Sso.Selection.PartyMode)
|
||||||
{
|
{
|
||||||
CSongs.Sort(_Sso.Sorting.SongSorting, _Sso.Sorting.Tabs, _Sso.Sorting.IgnoreArticles, _Sso.Sorting.SearchString, _Sso.Sorting.DuetOptions, _Sso.Sorting.FilterPlaylistID);
|
CSongs.Sort(_Sso.Sorting.SongSorting, _Sso.Sorting.Tabs, _Sso.Sorting.IgnoreArticles, _Sso.Sorting.SearchString, _Sso.Sorting.DuetOptions, _Sso.Sorting.FilterPlaylistID);
|
||||||
@@ -848,6 +949,60 @@ namespace Vocaluxe.Screens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void _ToggleSort(int sortNr)
|
||||||
|
{
|
||||||
|
if (CBase.Songs.IsInCategory() && _Sso.Selection.CategoryChangeAllowed)
|
||||||
|
{
|
||||||
|
CBase.Songs.SetCategory(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CSongs.Sorter.SongSorting = (ESongSorting)sortNr;
|
||||||
|
CConfig.Config.Game.SongSorting = CSongs.Sorter.SongSorting;
|
||||||
|
_Sso.Sorting.SongSorting = CSongs.Sorter.SongSorting;
|
||||||
|
|
||||||
|
_SongMenu.Update(_Sso);
|
||||||
|
_SongMenu.OnShow();
|
||||||
|
|
||||||
|
_ShowInfoText(CBase.Language.Translate("TR_SCREENSONG_SORTING").Replace("%s", CBase.Language.Translate(_Sso.Sorting.SongSorting.ToString())));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _ShowInfoText(String text)
|
||||||
|
{
|
||||||
|
_Texts[_TextShortInfoTop].Text = text;
|
||||||
|
_Statics[_StaticShortInfoTop].Visible = true;
|
||||||
|
_Texts[_TextShortInfoTop].Visible = true;
|
||||||
|
_TimerShortInfoText.Stop();
|
||||||
|
_TimerShortInfoText.Enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnTimedEventShortInfoText(Object source, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
_Statics[_StaticShortInfoTop].Visible = false;
|
||||||
|
_Texts[_TextShortInfoTop].Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _ToggleTabs()
|
||||||
|
{
|
||||||
|
EOffOn tmpStatus = CSongs.Categorizer.Tabs;
|
||||||
|
|
||||||
|
if (tmpStatus == EOffOn.TR_CONFIG_ON)
|
||||||
|
CSongs.Categorizer.Tabs = EOffOn.TR_CONFIG_OFF;
|
||||||
|
else
|
||||||
|
CSongs.Categorizer.Tabs = EOffOn.TR_CONFIG_ON;
|
||||||
|
|
||||||
|
CConfig.Config.Game.Tabs = CSongs.Categorizer.Tabs;
|
||||||
|
_Sso.Sorting.Tabs = CSongs.Categorizer.Tabs;
|
||||||
|
_SongMenu.Update(_Sso);
|
||||||
|
_SongMenu.OnShow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _ShowHighscore()
|
||||||
|
{
|
||||||
|
CGame.ClearSongs();
|
||||||
|
CScreenSong.setStaticSelectedSongID(CSongs.VisibleSongs[_SongMenu.GetPreviewSongNr()].ID);
|
||||||
|
CBase.Graphics.FadeTo(EScreen.Highscore);
|
||||||
|
}
|
||||||
|
|
||||||
private void _StartSong(int songNr)
|
private void _StartSong(int songNr)
|
||||||
{
|
{
|
||||||
if (CSongs.IsInCategory && (songNr >= 0))
|
if (CSongs.IsInCategory && (songNr >= 0))
|
||||||
@@ -885,7 +1040,10 @@ namespace Vocaluxe.Screens
|
|||||||
if (CSongs.IsInCategory && (songNr >= 0))
|
if (CSongs.IsInCategory && (songNr >= 0))
|
||||||
{
|
{
|
||||||
if (!CSongs.VisibleSongs[songNr].IsGameModeAvailable(EGameMode.TR_GAMEMODE_MEDLEY))
|
if (!CSongs.VisibleSongs[songNr].IsGameModeAvailable(EGameMode.TR_GAMEMODE_MEDLEY))
|
||||||
|
{
|
||||||
|
_ShowInfoText(CBase.Language.Translate("TR_SCREENSONG_NOMEDLEY"));
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CGame.Reset();
|
CGame.Reset();
|
||||||
CGame.ClearSongs();
|
CGame.ClearSongs();
|
||||||
@@ -1042,8 +1200,14 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
private void _JumpTo(char letter)
|
private void _JumpTo(char letter)
|
||||||
{
|
{
|
||||||
|
// Stefan1200: Add all letters from a key press within one second to a search string. Clear search string, if last key press is older than one second.
|
||||||
|
String searchString;
|
||||||
|
if (Environment.TickCount - _JumpTo_lastCharTime < 1000)
|
||||||
|
searchString = _JumpTo_lastSearchString + letter.ToString();
|
||||||
|
else
|
||||||
|
searchString = letter.ToString();
|
||||||
|
|
||||||
int start = 0;
|
int start = 0;
|
||||||
int curSelected = CSongs.IsInCategory ? _SongMenu.GetSelectedSongNr() : _SongMenu.GetSelectedCategory();
|
|
||||||
bool firstLevel = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_OFF && CSongs.IsInCategory;
|
bool firstLevel = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_OFF && CSongs.IsInCategory;
|
||||||
bool secondSort = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_ON &&
|
bool secondSort = CConfig.Config.Game.Tabs == EOffOn.TR_CONFIG_ON &&
|
||||||
(CConfig.Config.Game.SongSorting == ESongSorting.TR_CONFIG_ARTIST ||
|
(CConfig.Config.Game.SongSorting == ESongSorting.TR_CONFIG_ARTIST ||
|
||||||
@@ -1055,34 +1219,25 @@ namespace Vocaluxe.Screens
|
|||||||
//TODO: What's to do with multiple tags?
|
//TODO: What's to do with multiple tags?
|
||||||
//Flamefire: What? We only sorted by one tag, sorting by multiple tags (e.g. Album) will be by e.g. the first entry. That can be used here too as otherwhise it will confuse users because it jumps randomly
|
//Flamefire: What? We only sorted by one tag, sorting by multiple tags (e.g. Album) will be by e.g. the first entry. That can be used here too as otherwhise it will confuse users because it jumps randomly
|
||||||
ReadOnlyCollection<CSong> songs = CSongs.VisibleSongs;
|
ReadOnlyCollection<CSong> songs = CSongs.VisibleSongs;
|
||||||
int ct = songs.Count;
|
|
||||||
int visibleID = -1;
|
int visibleID = -1;
|
||||||
switch (CConfig.Config.Game.SongSorting)
|
switch (CConfig.Config.Game.SongSorting)
|
||||||
{
|
{
|
||||||
case ESongSorting.TR_CONFIG_ARTIST:
|
case ESongSorting.TR_CONFIG_ARTIST:
|
||||||
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
|
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.ArtistSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
|
||||||
start = curSelected + 1;
|
|
||||||
visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESongSorting.TR_CONFIG_YEAR:
|
case ESongSorting.TR_CONFIG_YEAR:
|
||||||
case ESongSorting.TR_CONFIG_DECADE:
|
case ESongSorting.TR_CONFIG_DECADE:
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Year.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
visibleID = _FindIndex(songs, start, element => element.Year.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
|
||||||
start = curSelected + 1;
|
|
||||||
visibleID = _FindIndex(songs, start, element => element.Year.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESongSorting.TR_CONFIG_TITLE_LETTER:
|
case ESongSorting.TR_CONFIG_TITLE_LETTER:
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.TitleSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
|
||||||
start = curSelected + 1;
|
|
||||||
visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESongSorting.TR_CONFIG_FOLDER:
|
case ESongSorting.TR_CONFIG_FOLDER:
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Folder.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
visibleID = _FindIndex(songs, start, element => element.FolderName.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
|
||||||
start = curSelected + 1;
|
|
||||||
visibleID = _FindIndex(songs, start, element => element.Folder.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (visibleID > -1)
|
if (visibleID > -1)
|
||||||
@@ -1091,22 +1246,17 @@ namespace Vocaluxe.Screens
|
|||||||
else if (secondSort && CSongs.IsInCategory)
|
else if (secondSort && CSongs.IsInCategory)
|
||||||
{
|
{
|
||||||
ReadOnlyCollection<CSong> songs = CSongs.VisibleSongs;
|
ReadOnlyCollection<CSong> songs = CSongs.VisibleSongs;
|
||||||
int ct = songs.Count;
|
|
||||||
int visibleID = -1;
|
int visibleID = -1;
|
||||||
switch (CConfig.Config.Game.SongSorting)
|
switch (CConfig.Config.Game.SongSorting)
|
||||||
{
|
{
|
||||||
case ESongSorting.TR_CONFIG_FOLDER:
|
case ESongSorting.TR_CONFIG_FOLDER:
|
||||||
case ESongSorting.TR_CONFIG_TITLE_LETTER:
|
case ESongSorting.TR_CONFIG_TITLE_LETTER:
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.ArtistSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Artist.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
|
||||||
start = curSelected + 1;
|
|
||||||
visibleID = _FindIndex(songs, start, element => element.Artist.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ESongSorting.TR_CONFIG_ARTIST:
|
case ESongSorting.TR_CONFIG_ARTIST:
|
||||||
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
|
case ESongSorting.TR_CONFIG_ARTIST_LETTER:
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && songs[curSelected].Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
visibleID = _FindIndex(songs, start, element => (_Sso.Sorting.IgnoreArticles == EOffOn.TR_CONFIG_ON ? element.TitleSorting.StartsWith(searchString, StringComparison.OrdinalIgnoreCase) : element.Title.StartsWith(searchString, StringComparison.OrdinalIgnoreCase)));
|
||||||
start = curSelected + 1;
|
|
||||||
visibleID = _FindIndex(songs, start, element => element.Title.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (visibleID > -1)
|
if (visibleID > -1)
|
||||||
@@ -1115,13 +1265,30 @@ namespace Vocaluxe.Screens
|
|||||||
else if (!CSongs.IsInCategory)
|
else if (!CSongs.IsInCategory)
|
||||||
{
|
{
|
||||||
ReadOnlyCollection<CCategory> categories = CSongs.Categories;
|
ReadOnlyCollection<CCategory> categories = CSongs.Categories;
|
||||||
int ct = categories.Count;
|
int visibleID = _FindIndex(categories, start, element => element.Name.StartsWith(searchString, StringComparison.OrdinalIgnoreCase));
|
||||||
if (curSelected >= 0 && curSelected < ct - 1 && categories[curSelected].Name.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase))
|
|
||||||
start = curSelected + 1;
|
|
||||||
int visibleID = _FindIndex(categories, start, element => element.Name.StartsWith(letter.ToString(), StringComparison.OrdinalIgnoreCase));
|
|
||||||
if (visibleID > -1)
|
if (visibleID > -1)
|
||||||
_SongMenu.SetSelectedCategory(visibleID);
|
_SongMenu.SetSelectedCategory(visibleID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stefan1200: Remember search string and current TickCount in class variables.
|
||||||
|
_JumpTo_lastCharTime = Environment.TickCount;
|
||||||
|
_JumpTo_lastSearchString = searchString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void _TogglePlaylistFilter()
|
||||||
|
{
|
||||||
|
if (_Sso.Sorting.FilterPlaylistID == _Playlist.ActivePlaylistID)
|
||||||
|
{
|
||||||
|
if (_Playlist.ActivePlaylistID == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_Sso.Sorting.FilterPlaylistID = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_Sso.Sorting.FilterPlaylistID = _Playlist.ActivePlaylistID;
|
||||||
|
|
||||||
|
CSongs.Sort(_Sso.Sorting.SongSorting, _Sso.Sorting.Tabs, _Sso.Sorting.IgnoreArticles, _Sso.Sorting.SearchString, _Sso.Sorting.DuetOptions, _Sso.Sorting.FilterPlaylistID);
|
||||||
|
_SongMenu.OnShow();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void _ApplyNewSearchFilter(string newFilterString)
|
private void _ApplyNewSearchFilter(string newFilterString)
|
||||||
@@ -1176,6 +1343,7 @@ namespace Vocaluxe.Screens
|
|||||||
_Buttons[_ButtonOptionsOpenSelectedItem].Visible = false;
|
_Buttons[_ButtonOptionsOpenSelectedItem].Visible = false;
|
||||||
_Buttons[_ButtonOptionsRandomMedley].Visible = false;
|
_Buttons[_ButtonOptionsRandomMedley].Visible = false;
|
||||||
_Buttons[_ButtonOptionsStartMedley].Visible = false;
|
_Buttons[_ButtonOptionsStartMedley].Visible = false;
|
||||||
|
_Buttons[_ButtonOptionsHighscore].Visible = false;
|
||||||
_Texts[_TextOptionsTitle].Visible = false;
|
_Texts[_TextOptionsTitle].Visible = false;
|
||||||
_Statics[_StaticOptionsBG].Visible = false;
|
_Statics[_StaticOptionsBG].Visible = false;
|
||||||
_Buttons[_ButtonOpenOptions].Visible = true;
|
_Buttons[_ButtonOpenOptions].Visible = true;
|
||||||
@@ -1232,6 +1400,7 @@ namespace Vocaluxe.Screens
|
|||||||
_SelectSlides[_SelectSlideOptionsPlaylistAdd].Visible = true;
|
_SelectSlides[_SelectSlideOptionsPlaylistAdd].Visible = true;
|
||||||
_Buttons[_ButtonOptionsSing].Visible = true;
|
_Buttons[_ButtonOptionsSing].Visible = true;
|
||||||
_Buttons[_ButtonOptionsPlaylist].Visible = true;
|
_Buttons[_ButtonOptionsPlaylist].Visible = true;
|
||||||
|
_Buttons[_ButtonOptionsHighscore].Visible = true;
|
||||||
_SelectElement(_Buttons[_ButtonOptionsSing]);
|
_SelectElement(_Buttons[_ButtonOptionsSing]);
|
||||||
_SetSelectSlidePlaylistToCurrentPlaylist();
|
_SetSelectSlidePlaylistToCurrentPlaylist();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -565,10 +565,10 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Rebuild for automatic package restore. The missing file is {0}.</ErrorText>
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Rebuild for automatic package restore. The missing file is {0}.</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.acinerella.1.0.5\build\vocaluxe.dependencies.acinerella.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.acinerella.1.0.5\build\vocaluxe.dependencies.acinerella.targets'))" />
|
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.acinerella.1.0.6\build\vocaluxe.dependencies.acinerella.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.acinerella.1.0.6\build\vocaluxe.dependencies.acinerella.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets'))" />
|
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets'))" />
|
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets'))" />
|
||||||
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.ffmpeg.1.0.4\build\vocaluxe.dependencies.ffmpeg.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.ffmpeg.1.0.4\build\vocaluxe.dependencies.ffmpeg.targets'))" />
|
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.ffmpeg.1.0.6\build\vocaluxe.dependencies.ffmpeg.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.ffmpeg.1.0.6\build\vocaluxe.dependencies.ffmpeg.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets'))" />
|
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets'))" />
|
||||||
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets'))" />
|
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets'))" />
|
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets'))" />
|
||||||
@@ -578,10 +578,10 @@
|
|||||||
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.gstreamer.1.0.3\build\vocaluxe.dependencies.gstreamer.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.gstreamer.1.0.3\build\vocaluxe.dependencies.gstreamer.targets'))" />
|
<Error Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND !Exists('..\packages\vocaluxe.dependencies.gstreamer.1.0.3\build\vocaluxe.dependencies.gstreamer.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.gstreamer.1.0.3\build\vocaluxe.dependencies.gstreamer.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.portaudiosharp.1.0.3\build\vocaluxe.dependencies.portaudiosharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.portaudiosharp.1.0.3\build\vocaluxe.dependencies.portaudiosharp.targets'))" />
|
<Error Condition="!Exists('..\packages\vocaluxe.dependencies.portaudiosharp.1.0.3\build\vocaluxe.dependencies.portaudiosharp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\vocaluxe.dependencies.portaudiosharp.1.0.3\build\vocaluxe.dependencies.portaudiosharp.targets'))" />
|
||||||
</Target>
|
</Target>
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.acinerella.1.0.5\build\vocaluxe.dependencies.acinerella.targets" Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND Exists('..\packages\vocaluxe.dependencies.acinerella.1.0.5\build\vocaluxe.dependencies.acinerella.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.acinerella.1.0.6\build\vocaluxe.dependencies.acinerella.targets" Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND Exists('..\packages\vocaluxe.dependencies.acinerella.1.0.6\build\vocaluxe.dependencies.acinerella.targets')" />
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets" Condition="Exists('..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets" Condition="Exists('..\packages\vocaluxe.dependencies.aforgevideo.1.0.1\build\vocaluxe.dependencies.aforgevideo.targets')" />
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets" Condition="Exists('..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets" Condition="Exists('..\packages\vocaluxe.dependencies.csharpsqlite.1.0.1\build\vocaluxe.dependencies.csharpsqlite.targets')" />
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.ffmpeg.1.0.4\build\vocaluxe.dependencies.ffmpeg.targets" Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND Exists('..\packages\vocaluxe.dependencies.ffmpeg.1.0.4\build\vocaluxe.dependencies.ffmpeg.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.ffmpeg.1.0.6\build\vocaluxe.dependencies.ffmpeg.targets" Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND Exists('..\packages\vocaluxe.dependencies.ffmpeg.1.0.6\build\vocaluxe.dependencies.ffmpeg.targets')" />
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets" Condition="Exists('..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets" Condition="Exists('..\packages\vocaluxe.dependencies.gstreamersharp.1.0.1\build\vocaluxe.dependencies.gstreamersharp.targets')" />
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets" Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND Exists('..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets" Condition="'$(Configuration)' != 'ReleaseLinux' AND '$(Configuration)' != 'DebugLinux' AND Exists('..\packages\vocaluxe.dependencies.hidapi.1.0.4\build\vocaluxe.dependencies.hidapi.targets')" />
|
||||||
<Import Project="..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets" Condition="Exists('..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets')" />
|
<Import Project="..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets" Condition="Exists('..\packages\vocaluxe.dependencies.opentk.1.0.1\build\vocaluxe.dependencies.opentk.targets')" />
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net471" />
|
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net471" />
|
||||||
<package id="vocaluxe.dependencies.acinerella" version="1.0.5" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.acinerella" version="1.0.6" targetFramework="net40" />
|
||||||
<package id="vocaluxe.dependencies.aforgevideo" version="1.0.1" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.aforgevideo" version="1.0.1" targetFramework="net40" />
|
||||||
<package id="vocaluxe.dependencies.csharpsqlite" version="1.0.1" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.csharpsqlite" version="1.0.1" targetFramework="net40" />
|
||||||
<package id="vocaluxe.dependencies.ffmpeg" version="1.0.4" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.ffmpeg" version="1.0.6" targetFramework="net40" />
|
||||||
<package id="vocaluxe.dependencies.gstreamer" version="1.0.3" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.gstreamer" version="1.0.3" targetFramework="net40" />
|
||||||
<package id="vocaluxe.dependencies.gstreamersharp" version="1.0.1" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.gstreamersharp" version="1.0.1" targetFramework="net40" />
|
||||||
<package id="vocaluxe.dependencies.hidapi" version="1.0.4" targetFramework="net40" />
|
<package id="vocaluxe.dependencies.hidapi" version="1.0.4" targetFramework="net40" />
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#region license
|
#region license
|
||||||
// This file is part of Vocaluxe.
|
// This file is part of Vocaluxe.
|
||||||
//
|
//
|
||||||
// Vocaluxe is free software: you can redistribute it and/or modify
|
// Vocaluxe is free software: you can redistribute it and/or modify
|
||||||
@@ -101,6 +101,7 @@ namespace VocaluxeLib
|
|||||||
|
|
||||||
switch (aspect)
|
switch (aspect)
|
||||||
{
|
{
|
||||||
|
case EAspect.Automatic:
|
||||||
case EAspect.Crop:
|
case EAspect.Crop:
|
||||||
if (boundsAspectRatio >= aspectRatio)
|
if (boundsAspectRatio >= aspectRatio)
|
||||||
{
|
{
|
||||||
@@ -138,7 +139,7 @@ namespace VocaluxeLib
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EAspect.LetterBox:
|
case EAspect.LetterBox:
|
||||||
if (boundsAspectRatio <= aspectRatio)
|
if (boundsAspectRatio < aspectRatio)
|
||||||
{
|
{
|
||||||
scaledWidth = bounds.W;
|
scaledWidth = bounds.W;
|
||||||
scaledHeight = bounds.W / aspectRatio;
|
scaledHeight = bounds.W / aspectRatio;
|
||||||
@@ -149,6 +150,10 @@ namespace VocaluxeLib
|
|||||||
scaledWidth = bounds.H * aspectRatio;
|
scaledWidth = bounds.H * aspectRatio;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case EAspect.PillarBox:
|
||||||
|
scaledWidth = bounds.W * 0.77f;
|
||||||
|
scaledHeight = bounds.W / aspectRatio;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return bounds;
|
return bounds;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,8 +64,10 @@ namespace VocaluxeLib
|
|||||||
#region Fonts
|
#region Fonts
|
||||||
public enum EAspect
|
public enum EAspect
|
||||||
{
|
{
|
||||||
|
Automatic,
|
||||||
Crop,
|
Crop,
|
||||||
LetterBox,
|
LetterBox,
|
||||||
|
PillarBox,
|
||||||
Stretch,
|
Stretch,
|
||||||
Zoom1,
|
Zoom1,
|
||||||
Zoom2
|
Zoom2
|
||||||
|
|||||||
@@ -171,10 +171,10 @@ namespace VocaluxeLib
|
|||||||
public static SRectF Scale(this SRectF rect, float scale)
|
public static SRectF Scale(this SRectF rect, float scale)
|
||||||
{
|
{
|
||||||
return new SRectF(
|
return new SRectF(
|
||||||
rect.X - rect.W * (scale - 1f),
|
rect.X - rect.W * (scale - 1f) * 0.5f,
|
||||||
rect.Y - rect.H * (scale - 1f),
|
rect.Y - rect.H * (scale - 1f) * 0.5f,
|
||||||
rect.W + 2 * rect.W * (scale - 1f),
|
rect.W * scale,
|
||||||
rect.H + 2 * rect.H * (scale - 1f),
|
rect.H * scale,
|
||||||
rect.Z);
|
rect.Z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -304,6 +304,7 @@ namespace VocaluxeLib
|
|||||||
{
|
{
|
||||||
bool Exists(int playlistID);
|
bool Exists(int playlistID);
|
||||||
string GetName(int playlistID);
|
string GetName(int playlistID);
|
||||||
|
List<int> GetIds();
|
||||||
List<string> GetNames();
|
List<string> GetNames();
|
||||||
|
|
||||||
void SetName(int playlistID, string name);
|
void SetName(int playlistID, string name);
|
||||||
|
|||||||
@@ -100,6 +100,8 @@ namespace VocaluxeLib.Menu
|
|||||||
protected int NumMinMedleySongs = 3;
|
protected int NumMinMedleySongs = 3;
|
||||||
protected int NumMaxMedleySongs = 10;
|
protected int NumMaxMedleySongs = 10;
|
||||||
|
|
||||||
|
private List<int> _PlaylistIDs;
|
||||||
|
|
||||||
public override void Init()
|
public override void Init()
|
||||||
{
|
{
|
||||||
base.Init();
|
base.Init();
|
||||||
@@ -188,6 +190,8 @@ namespace VocaluxeLib.Menu
|
|||||||
_SelectSlides[_SelectSlideSorting].AddValue(ss.ToString());
|
_SelectSlides[_SelectSlideSorting].AddValue(ss.ToString());
|
||||||
|
|
||||||
_SelectSlides[_SelectSlidePlaylist].Clear();
|
_SelectSlides[_SelectSlidePlaylist].Clear();
|
||||||
|
_SelectSlides[_SelectSlidePlaylist].NumVisible = 1; // Make sure that only one playlist at a time will be displayed (or the names overlap)
|
||||||
|
_PlaylistIDs = CBase.Playlist.GetIds();
|
||||||
List<string> playlists = CBase.Playlist.GetNames();
|
List<string> playlists = CBase.Playlist.GetNames();
|
||||||
for (int i = 0; i < playlists.Count; i++)
|
for (int i = 0; i < playlists.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -220,7 +224,12 @@ namespace VocaluxeLib.Menu
|
|||||||
_SongMode = _SelectSlides[_SelectSlideSongMode].Selection;
|
_SongMode = _SelectSlides[_SelectSlideSongMode].Selection;
|
||||||
_Source = _SelectSlides[_SelectSlideSource].Selection;
|
_Source = _SelectSlides[_SelectSlideSource].Selection;
|
||||||
NumMedleySongs = NumMinMedleySongs + _SelectSlides[_SelectSlideNumMedleySongs].Selection;
|
NumMedleySongs = NumMinMedleySongs + _SelectSlides[_SelectSlideNumMedleySongs].Selection;
|
||||||
Playlist = _SelectSlides[_SelectSlidePlaylist].Selection;
|
|
||||||
|
int playlistSelection = _SelectSlides[_SelectSlidePlaylist].Selection;
|
||||||
|
if (playlistSelection >= 0 && playlistSelection < _PlaylistIDs.Count)
|
||||||
|
Playlist = _PlaylistIDs[playlistSelection];
|
||||||
|
else
|
||||||
|
Playlist = -1;
|
||||||
|
|
||||||
if (_SelectSlides[_SelectSlideSorting].Selection != _Sorting)
|
if (_SelectSlides[_SelectSlideSorting].Selection != _Sorting)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ namespace VocaluxeLib.Menu
|
|||||||
public SThemeButton ButtonPlaylistSave;
|
public SThemeButton ButtonPlaylistSave;
|
||||||
public SThemeButton ButtonPlaylistDelete;
|
public SThemeButton ButtonPlaylistDelete;
|
||||||
public SThemeButton ButtonPlaylistSing;
|
public SThemeButton ButtonPlaylistSing;
|
||||||
|
public SThemeButton ButtonPlaylistList;
|
||||||
|
|
||||||
public SThemeSelectSlide SelectSlideGameMode;
|
public SThemeSelectSlide SelectSlideGameMode;
|
||||||
}
|
}
|
||||||
@@ -163,6 +164,7 @@ namespace VocaluxeLib.Menu
|
|||||||
private readonly CButton _ButtonPlaylistSave;
|
private readonly CButton _ButtonPlaylistSave;
|
||||||
private readonly CButton _ButtonPlaylistDelete;
|
private readonly CButton _ButtonPlaylistDelete;
|
||||||
private readonly CButton _ButtonPlaylistSing;
|
private readonly CButton _ButtonPlaylistSing;
|
||||||
|
private readonly CButton _ButtonPlaylistList;
|
||||||
private readonly CText _Text1;
|
private readonly CText _Text1;
|
||||||
private readonly CSelectSlide _SelectSlideGameMode;
|
private readonly CSelectSlide _SelectSlideGameMode;
|
||||||
private readonly CStatic _StaticPlaylistHeader;
|
private readonly CStatic _StaticPlaylistHeader;
|
||||||
@@ -235,6 +237,7 @@ namespace VocaluxeLib.Menu
|
|||||||
_ButtonPlaylistDelete = new CButton(_PartyModeID);
|
_ButtonPlaylistDelete = new CButton(_PartyModeID);
|
||||||
_ButtonPlaylistSave = new CButton(_PartyModeID);
|
_ButtonPlaylistSave = new CButton(_PartyModeID);
|
||||||
_ButtonPlaylistSing = new CButton(_PartyModeID);
|
_ButtonPlaylistSing = new CButton(_PartyModeID);
|
||||||
|
_ButtonPlaylistList = new CButton(_PartyModeID);
|
||||||
_SelectSlideGameMode = new CSelectSlide(_PartyModeID);
|
_SelectSlideGameMode = new CSelectSlide(_PartyModeID);
|
||||||
|
|
||||||
Visible = false;
|
Visible = false;
|
||||||
@@ -254,6 +257,7 @@ namespace VocaluxeLib.Menu
|
|||||||
_ButtonPlaylistDelete = new CButton(_Theme.ButtonPlaylistDelete, _PartyModeID);
|
_ButtonPlaylistDelete = new CButton(_Theme.ButtonPlaylistDelete, _PartyModeID);
|
||||||
_ButtonPlaylistSave = new CButton(_Theme.ButtonPlaylistSave, _PartyModeID);
|
_ButtonPlaylistSave = new CButton(_Theme.ButtonPlaylistSave, _PartyModeID);
|
||||||
_ButtonPlaylistSing = new CButton(_Theme.ButtonPlaylistSing, _PartyModeID);
|
_ButtonPlaylistSing = new CButton(_Theme.ButtonPlaylistSing, _PartyModeID);
|
||||||
|
_ButtonPlaylistList = new CButton(_Theme.ButtonPlaylistList, _PartyModeID);
|
||||||
_SelectSlideGameMode = new CSelectSlide(_Theme.SelectSlideGameMode, _PartyModeID);
|
_SelectSlideGameMode = new CSelectSlide(_Theme.SelectSlideGameMode, _PartyModeID);
|
||||||
|
|
||||||
_AddStatic(_StaticPlaylistFooter);
|
_AddStatic(_StaticPlaylistFooter);
|
||||||
@@ -263,6 +267,7 @@ namespace VocaluxeLib.Menu
|
|||||||
_AddButton(_ButtonPlaylistDelete);
|
_AddButton(_ButtonPlaylistDelete);
|
||||||
_AddButton(_ButtonPlaylistSave);
|
_AddButton(_ButtonPlaylistSave);
|
||||||
_AddButton(_ButtonPlaylistSing);
|
_AddButton(_ButtonPlaylistSing);
|
||||||
|
_AddButton(_ButtonPlaylistList);
|
||||||
|
|
||||||
Visible = false;
|
Visible = false;
|
||||||
Selected = false;
|
Selected = false;
|
||||||
@@ -279,6 +284,7 @@ namespace VocaluxeLib.Menu
|
|||||||
_Theme.ButtonPlaylistClose = (SThemeButton)_ButtonPlaylistClose.GetTheme();
|
_Theme.ButtonPlaylistClose = (SThemeButton)_ButtonPlaylistClose.GetTheme();
|
||||||
_Theme.ButtonPlaylistSave = (SThemeButton)_ButtonPlaylistSave.GetTheme();
|
_Theme.ButtonPlaylistSave = (SThemeButton)_ButtonPlaylistSave.GetTheme();
|
||||||
_Theme.ButtonPlaylistDelete = (SThemeButton)_ButtonPlaylistDelete.GetTheme();
|
_Theme.ButtonPlaylistDelete = (SThemeButton)_ButtonPlaylistDelete.GetTheme();
|
||||||
|
_Theme.ButtonPlaylistList = (SThemeButton)_ButtonPlaylistList.GetTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateGame()
|
public void UpdateGame()
|
||||||
@@ -321,6 +327,7 @@ namespace VocaluxeLib.Menu
|
|||||||
_ButtonPlaylistName.UnloadSkin();
|
_ButtonPlaylistName.UnloadSkin();
|
||||||
_ButtonPlaylistSave.UnloadSkin();
|
_ButtonPlaylistSave.UnloadSkin();
|
||||||
_ButtonPlaylistSing.UnloadSkin();
|
_ButtonPlaylistSing.UnloadSkin();
|
||||||
|
_ButtonPlaylistList.UnloadSkin();
|
||||||
|
|
||||||
_StaticPlaylistFooter.UnloadSkin();
|
_StaticPlaylistFooter.UnloadSkin();
|
||||||
_StaticPlaylistHeader.UnloadSkin();
|
_StaticPlaylistHeader.UnloadSkin();
|
||||||
@@ -342,6 +349,7 @@ namespace VocaluxeLib.Menu
|
|||||||
_ButtonPlaylistName.LoadSkin();
|
_ButtonPlaylistName.LoadSkin();
|
||||||
_ButtonPlaylistSave.LoadSkin();
|
_ButtonPlaylistSave.LoadSkin();
|
||||||
_ButtonPlaylistSing.LoadSkin();
|
_ButtonPlaylistSing.LoadSkin();
|
||||||
|
_ButtonPlaylistList.LoadSkin();
|
||||||
|
|
||||||
_StaticPlaylistFooter.LoadSkin();
|
_StaticPlaylistFooter.LoadSkin();
|
||||||
_StaticPlaylistHeader.LoadSkin();
|
_StaticPlaylistHeader.LoadSkin();
|
||||||
@@ -492,7 +500,7 @@ namespace VocaluxeLib.Menu
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Enter:
|
case Keys.Enter:
|
||||||
_StartPlaylistSong(_CurrentPlaylistElement);
|
_StartPlaylistSong(_CurrentPlaylistElement + _Offset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Add: //move the selected song up
|
case Keys.Add: //move the selected song up
|
||||||
@@ -640,6 +648,8 @@ namespace VocaluxeLib.Menu
|
|||||||
_StartPlaylistSongs();
|
_StartPlaylistSongs();
|
||||||
else if (_ButtonPlaylistSave.Selected)
|
else if (_ButtonPlaylistSave.Selected)
|
||||||
CBase.Playlist.Save(ActivePlaylistID);
|
CBase.Playlist.Save(ActivePlaylistID);
|
||||||
|
else if (isButtonPlaylistListSelected())
|
||||||
|
return false; // Currently CScreenSong do this event!
|
||||||
else if (_ButtonPlaylistDelete.Selected)
|
else if (_ButtonPlaylistDelete.Selected)
|
||||||
{
|
{
|
||||||
CBase.Playlist.Delete(ActivePlaylistID);
|
CBase.Playlist.Delete(ActivePlaylistID);
|
||||||
@@ -672,6 +682,11 @@ namespace VocaluxeLib.Menu
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool isButtonPlaylistListSelected()
|
||||||
|
{
|
||||||
|
return _ButtonPlaylistList.Selected;
|
||||||
|
}
|
||||||
|
|
||||||
private void _SetSelectionToLastEntry()
|
private void _SetSelectionToLastEntry()
|
||||||
{
|
{
|
||||||
if (_PlaylistElementContents.Count == 0)
|
if (_PlaylistElementContents.Count == 0)
|
||||||
@@ -781,6 +796,8 @@ namespace VocaluxeLib.Menu
|
|||||||
//LB actions
|
//LB actions
|
||||||
if (mouseEvent.LB)
|
if (mouseEvent.LB)
|
||||||
{
|
{
|
||||||
|
if (isButtonPlaylistListSelected())
|
||||||
|
return false; // Currently CScreenSong do this event!
|
||||||
if (_CurrentPlaylistElement != -1)
|
if (_CurrentPlaylistElement != -1)
|
||||||
{
|
{
|
||||||
CBase.Playlist.GetSong(ActivePlaylistID, _CurrentPlaylistElement + _Offset).GameMode =
|
CBase.Playlist.GetSong(ActivePlaylistID, _CurrentPlaylistElement + _Offset).GameMode =
|
||||||
@@ -818,7 +835,7 @@ namespace VocaluxeLib.Menu
|
|||||||
|
|
||||||
//Start selected song with double click
|
//Start selected song with double click
|
||||||
if (mouseEvent.LD && _CurrentPlaylistElement != -1)
|
if (mouseEvent.LD && _CurrentPlaylistElement != -1)
|
||||||
_StartPlaylistSong(_CurrentPlaylistElement);
|
_StartPlaylistSong(_CurrentPlaylistElement + _Offset);
|
||||||
|
|
||||||
//Change order with holding LB
|
//Change order with holding LB
|
||||||
if (mouseEvent.LBH && _CurrentPlaylistElement != -1 && _PlaylistElementContents.Count > 0 && DragAndDropSongID == -1)
|
if (mouseEvent.LBH && _CurrentPlaylistElement != -1 && _PlaylistElementContents.Count > 0 && DragAndDropSongID == -1)
|
||||||
@@ -972,6 +989,11 @@ namespace VocaluxeLib.Menu
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool isPlaylistNameEditMode()
|
||||||
|
{
|
||||||
|
return _EditMode == EEditMode.PlaylistName;
|
||||||
|
}
|
||||||
|
|
||||||
private void _PrepareList()
|
private void _PrepareList()
|
||||||
{
|
{
|
||||||
_PlaylistElements.Clear();
|
_PlaylistElements.Clear();
|
||||||
@@ -1166,6 +1188,15 @@ namespace VocaluxeLib.Menu
|
|||||||
_CompleteRect.W = _ButtonPlaylistDelete.Rect.W + _ButtonPlaylistDelete.Rect.X - _CompleteRect.X;
|
_CompleteRect.W = _ButtonPlaylistDelete.Rect.W + _ButtonPlaylistDelete.Rect.X - _CompleteRect.X;
|
||||||
if (_ButtonPlaylistDelete.Rect.Y + _ButtonPlaylistDelete.Rect.H > _CompleteRect.Y + _CompleteRect.H)
|
if (_ButtonPlaylistDelete.Rect.Y + _ButtonPlaylistDelete.Rect.H > _CompleteRect.Y + _CompleteRect.H)
|
||||||
_CompleteRect.H = _ButtonPlaylistDelete.Rect.H + _ButtonPlaylistDelete.Rect.Y - _CompleteRect.Y;
|
_CompleteRect.H = _ButtonPlaylistDelete.Rect.H + _ButtonPlaylistDelete.Rect.Y - _CompleteRect.Y;
|
||||||
|
//ButtonPlaylistList
|
||||||
|
if (_ButtonPlaylistList.Rect.X < _CompleteRect.X)
|
||||||
|
_CompleteRect.X = _ButtonPlaylistList.Rect.X;
|
||||||
|
if (_ButtonPlaylistList.Rect.Y < _CompleteRect.Y)
|
||||||
|
_CompleteRect.Y = _ButtonPlaylistList.Rect.Y;
|
||||||
|
if (_ButtonPlaylistList.Rect.W + _ButtonPlaylistList.Rect.X > _CompleteRect.W + _CompleteRect.X)
|
||||||
|
_CompleteRect.W = _ButtonPlaylistList.Rect.W + _ButtonPlaylistList.Rect.X - _CompleteRect.X;
|
||||||
|
if (_ButtonPlaylistList.Rect.Y + _ButtonPlaylistList.Rect.H > _CompleteRect.Y + _CompleteRect.H)
|
||||||
|
_CompleteRect.H = _ButtonPlaylistList.Rect.H + _ButtonPlaylistList.Rect.Y - _CompleteRect.Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region ThemeEdit
|
#region ThemeEdit
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
public SThemeText TextArtist;
|
public SThemeText TextArtist;
|
||||||
public SThemeText TextTitle;
|
public SThemeText TextTitle;
|
||||||
public SThemeText TextSongLength;
|
public SThemeText TextSongLength;
|
||||||
|
public SThemeText TextSongYear;
|
||||||
|
|
||||||
public SThemeStatic StaticCoverBig;
|
public SThemeStatic StaticCoverBig;
|
||||||
public SThemeStatic StaticTextBG;
|
public SThemeStatic StaticTextBG;
|
||||||
@@ -111,6 +112,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
public SThemeText TextArtist;
|
public SThemeText TextArtist;
|
||||||
public SThemeText TextTitle;
|
public SThemeText TextTitle;
|
||||||
public SThemeText TextSongLength;
|
public SThemeText TextSongLength;
|
||||||
|
public SThemeText TextSongYear;
|
||||||
|
|
||||||
public SThemeStatic StaticCoverBig;
|
public SThemeStatic StaticCoverBig;
|
||||||
public SThemeStatic StaticTextBG;
|
public SThemeStatic StaticTextBG;
|
||||||
@@ -220,7 +222,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
EScreen check = CBase.Graphics.GetNextScreenType();
|
EScreen check = CBase.Graphics.GetNextScreenType();
|
||||||
if (CBase.Graphics.GetNextScreenType() == EScreen.Sing)
|
if (CBase.Graphics.GetNextScreenType() == EScreen.Sing)
|
||||||
_ResetPreview(false);
|
_ResetPreview(false);
|
||||||
else if (CBase.Graphics.GetNextScreenType() != EScreen.Names || CBase.Config.GetBackgroundMusicStatus() == EBackgroundMusicOffOn.TR_CONFIG_OFF)
|
else if ((CBase.Graphics.GetNextScreenType() != EScreen.Names && CBase.Graphics.GetNextScreenType() != EScreen.Highscore) || CBase.Config.GetBackgroundMusicStatus() == EBackgroundMusicOffOn.TR_CONFIG_OFF)
|
||||||
_ResetPreview();
|
_ResetPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
private readonly CText _Artist;
|
private readonly CText _Artist;
|
||||||
private readonly CText _Title;
|
private readonly CText _Title;
|
||||||
private readonly CText _SongLength;
|
private readonly CText _SongLength;
|
||||||
|
private readonly CText _SongYear;
|
||||||
|
|
||||||
private float _SpaceW;
|
private float _SpaceW;
|
||||||
private float _SpaceH;
|
private float _SpaceH;
|
||||||
@@ -118,19 +119,21 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
_Artist = new CText(_Theme.SongMenuList.TextArtist, _PartyModeID);
|
_Artist = new CText(_Theme.SongMenuList.TextArtist, _PartyModeID);
|
||||||
_Title = new CText(_Theme.SongMenuList.TextTitle, _PartyModeID);
|
_Title = new CText(_Theme.SongMenuList.TextTitle, _PartyModeID);
|
||||||
_SongLength = new CText(_Theme.SongMenuList.TextSongLength, _PartyModeID);
|
_SongLength = new CText(_Theme.SongMenuList.TextSongLength, _PartyModeID);
|
||||||
|
_SongYear = new CText(_Theme.SongMenuList.TextSongYear, _PartyModeID);
|
||||||
_CoverBig = new CStatic(_Theme.SongMenuList.StaticCoverBig, _PartyModeID);
|
_CoverBig = new CStatic(_Theme.SongMenuList.StaticCoverBig, _PartyModeID);
|
||||||
_TextBG = new CStatic(_Theme.SongMenuList.StaticTextBG, _PartyModeID);
|
_TextBG = new CStatic(_Theme.SongMenuList.StaticTextBG, _PartyModeID);
|
||||||
_DuetIcon = new CStatic(_Theme.SongMenuList.StaticDuetIcon, _PartyModeID);
|
_DuetIcon = new CStatic(_Theme.SongMenuList.StaticDuetIcon, _PartyModeID);
|
||||||
_VideoIcon = new CStatic(_Theme.SongMenuList.StaticVideoIcon, _PartyModeID);
|
_VideoIcon = new CStatic(_Theme.SongMenuList.StaticVideoIcon, _PartyModeID);
|
||||||
_MedleyCalcIcon = new CStatic(_Theme.SongMenuList.StaticMedleyCalcIcon, _PartyModeID);
|
_MedleyCalcIcon = new CStatic(_Theme.SongMenuList.StaticMedleyCalcIcon, _PartyModeID);
|
||||||
_MedleyTagIcon = new CStatic(_Theme.SongMenuList.StaticMedleyTagIcon, _PartyModeID);
|
_MedleyTagIcon = new CStatic(_Theme.SongMenuList.StaticMedleyTagIcon, _PartyModeID);
|
||||||
_SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
|
_SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _SongYear, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void _ReadSubTheme()
|
private void _ReadSubTheme()
|
||||||
{
|
{
|
||||||
_Theme.SongMenuList.TextArtist = (SThemeText)_Artist.GetTheme();
|
_Theme.SongMenuList.TextArtist = (SThemeText)_Artist.GetTheme();
|
||||||
_Theme.SongMenuList.TextSongLength = (SThemeText)_SongLength.GetTheme();
|
_Theme.SongMenuList.TextSongLength = (SThemeText)_SongLength.GetTheme();
|
||||||
|
_Theme.SongMenuList.TextSongYear = (SThemeText)_SongYear.GetTheme();
|
||||||
_Theme.SongMenuList.TextTitle = (SThemeText)_Title.GetTheme();
|
_Theme.SongMenuList.TextTitle = (SThemeText)_Title.GetTheme();
|
||||||
_Theme.SongMenuList.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
|
_Theme.SongMenuList.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
|
||||||
_Theme.SongMenuList.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
|
_Theme.SongMenuList.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
|
||||||
@@ -173,12 +176,12 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
for (int i = 0; i < _ListLength; i++)
|
for (int i = 0; i < _ListLength; i++)
|
||||||
{
|
{
|
||||||
//Create Cover
|
//Create Cover
|
||||||
var rect = new SRectF(Rect.X + (_TileW + _SpaceW), Rect.Y + i * (_TileH + _SpaceH), _TileW, _TileH, Rect.Z);
|
var rect = new SRectF(Rect.X, Rect.Y + i * (_TileH + _SpaceH), _TileW, _TileH, Rect.Z);
|
||||||
var tile = new CStatic(_PartyModeID, _CoverBGTexture, _Color, rect);
|
var tile = new CStatic(_PartyModeID, _CoverBGTexture, _Color, rect);
|
||||||
_Tiles.Add(tile);
|
_Tiles.Add(tile);
|
||||||
|
|
||||||
//Create text
|
//Create text
|
||||||
var textRect = new SRectF(MaxRect.X + 2 * (_TileW + _SpaceW), Rect.Y + i * (_TileH + _SpaceH), _ListTextWidth, _TileH, Rect.Z);
|
var textRect = new SRectF(MaxRect.X + (_TileW + _SpaceW), Rect.Y + i * (_TileH + _SpaceH), _ListTextWidth, _TileH, Rect.Z);
|
||||||
CText text = new CText(textRect.X, textRect.Y, textRect.Z,
|
CText text = new CText(textRect.X, textRect.Y, textRect.Z,
|
||||||
textRect.H, textRect.W, EAlignment.Left, EStyle.Normal,
|
textRect.H, textRect.W, EAlignment.Left, EStyle.Normal,
|
||||||
"Normal", _Artist.Color, "");
|
"Normal", _Artist.Color, "");
|
||||||
@@ -217,6 +220,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
_Artist.Text = String.Empty;
|
_Artist.Text = String.Empty;
|
||||||
_Title.Text = String.Empty;
|
_Title.Text = String.Empty;
|
||||||
_SongLength.Text = String.Empty;
|
_SongLength.Text = String.Empty;
|
||||||
|
_SongYear.Text = String.Empty;
|
||||||
_DuetIcon.Visible = false;
|
_DuetIcon.Visible = false;
|
||||||
_VideoIcon.Visible = false;
|
_VideoIcon.Visible = false;
|
||||||
_MedleyCalcIcon.Visible = false;
|
_MedleyCalcIcon.Visible = false;
|
||||||
@@ -245,6 +249,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
_CoverBig.Texture = song.CoverTextureBig;
|
_CoverBig.Texture = song.CoverTextureBig;
|
||||||
_Artist.Text = song.Artist;
|
_Artist.Text = song.Artist;
|
||||||
_Title.Text = song.Title;
|
_Title.Text = song.Title;
|
||||||
|
_SongYear.Text = song.Year;
|
||||||
_DuetIcon.Visible = song.IsDuet;
|
_DuetIcon.Visible = song.IsDuet;
|
||||||
_VideoIcon.Visible = song.VideoFileName != "";
|
_VideoIcon.Visible = song.VideoFileName != "";
|
||||||
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
|
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
|
||||||
@@ -344,19 +349,53 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.PageUp:
|
case Keys.PageUp:
|
||||||
if (catChangePossible)
|
if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
|
||||||
{
|
{
|
||||||
_PrevCategory();
|
_PrevCategory();
|
||||||
keyEvent.Handled = true;
|
keyEvent.Handled = true;
|
||||||
}
|
}
|
||||||
|
else if (moveAllowed)
|
||||||
|
{
|
||||||
|
if ((_SelectionNr - _ListLength) <= 0)
|
||||||
|
_SelectionNr = 0;
|
||||||
|
else
|
||||||
|
_SelectionNr = _SelectionNr - _ListLength;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.PageDown:
|
case Keys.PageDown:
|
||||||
if (catChangePossible)
|
if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
|
||||||
{
|
{
|
||||||
_NextCategory();
|
_NextCategory();
|
||||||
keyEvent.Handled = true;
|
keyEvent.Handled = true;
|
||||||
}
|
}
|
||||||
|
else if (moveAllowed)
|
||||||
|
{
|
||||||
|
int maxCount_PageDown = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
|
||||||
|
if ((_SelectionNr + _ListLength) >= maxCount_PageDown)
|
||||||
|
_SelectionNr = maxCount_PageDown - 1;
|
||||||
|
else
|
||||||
|
_SelectionNr = _SelectionNr + _ListLength;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.Home:
|
||||||
|
if (moveAllowed)
|
||||||
|
{
|
||||||
|
_SelectionNr = 0;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.End:
|
||||||
|
int maxCount_End = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
|
||||||
|
if (moveAllowed)
|
||||||
|
{
|
||||||
|
_SelectionNr = maxCount_End - 1;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Left:
|
case Keys.Left:
|
||||||
@@ -511,7 +550,9 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
}
|
}
|
||||||
_TextBG.Draw();
|
_TextBG.Draw();
|
||||||
|
|
||||||
CTextureRef vidtex = CBase.BackgroundMusic.IsPlayingPreview() ? CBase.BackgroundMusic.GetVideoTexture() : null;
|
CTextureRef vidtex = null;
|
||||||
|
if (CBase.Config.GetVideoPreview() == EOffOn.TR_CONFIG_ON)
|
||||||
|
vidtex = (CBase.BackgroundMusic.IsPlayingPreview() ? CBase.BackgroundMusic.GetVideoTexture() : null);
|
||||||
|
|
||||||
if (vidtex != null)
|
if (vidtex != null)
|
||||||
{
|
{
|
||||||
@@ -592,13 +633,28 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
|
|
||||||
private void _UpdateList(bool force = false)
|
private void _UpdateList(bool force = false)
|
||||||
{
|
{
|
||||||
|
bool isInCategory = CBase.Songs.IsInCategory();
|
||||||
|
int itemCount = isInCategory ? CBase.Songs.GetNumSongsVisible() : CBase.Songs.GetNumCategories();
|
||||||
|
int halfListLength = _ListLength / 2;
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
if (_SelectionNr < _Offset && _SelectionNr >= 0)
|
if (_SelectionNr < _Offset && _SelectionNr >= 0)
|
||||||
offset = _SelectionNr;
|
{
|
||||||
|
if (_SelectionNr - halfListLength >= 0)
|
||||||
|
offset = _SelectionNr - halfListLength;
|
||||||
|
else
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
else if (_SelectionNr >= _Offset + _ListLength)
|
else if (_SelectionNr >= _Offset + _ListLength)
|
||||||
offset = _SelectionNr - _ListLength + 1;
|
{
|
||||||
|
if (_SelectionNr + halfListLength > itemCount)
|
||||||
|
offset = itemCount - _ListLength;
|
||||||
|
else
|
||||||
|
offset = _SelectionNr - halfListLength;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
offset = _Offset;
|
offset = _Offset;
|
||||||
|
|
||||||
_UpdateList(offset, force);
|
_UpdateList(offset, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
private CText _Artist;
|
private CText _Artist;
|
||||||
private CText _Title;
|
private CText _Title;
|
||||||
private CText _SongLength;
|
private CText _SongLength;
|
||||||
|
private CText _SongYear;
|
||||||
|
|
||||||
private int _NumW;
|
private int _NumW;
|
||||||
private int _NumH;
|
private int _NumH;
|
||||||
@@ -113,13 +114,14 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
_Artist = new CText(_Theme.SongMenuTileBoard.TextArtist, _PartyModeID);
|
_Artist = new CText(_Theme.SongMenuTileBoard.TextArtist, _PartyModeID);
|
||||||
_Title = new CText(_Theme.SongMenuTileBoard.TextTitle, _PartyModeID);
|
_Title = new CText(_Theme.SongMenuTileBoard.TextTitle, _PartyModeID);
|
||||||
_SongLength = new CText(_Theme.SongMenuTileBoard.TextSongLength, _PartyModeID);
|
_SongLength = new CText(_Theme.SongMenuTileBoard.TextSongLength, _PartyModeID);
|
||||||
|
_SongYear = new CText(_Theme.SongMenuTileBoard.TextSongYear, _PartyModeID);
|
||||||
_CoverBig = new CStatic(_Theme.SongMenuTileBoard.StaticCoverBig, _PartyModeID);
|
_CoverBig = new CStatic(_Theme.SongMenuTileBoard.StaticCoverBig, _PartyModeID);
|
||||||
_TextBG = new CStatic(_Theme.SongMenuTileBoard.StaticTextBG, _PartyModeID);
|
_TextBG = new CStatic(_Theme.SongMenuTileBoard.StaticTextBG, _PartyModeID);
|
||||||
_DuetIcon = new CStatic(_Theme.SongMenuTileBoard.StaticDuetIcon, _PartyModeID);
|
_DuetIcon = new CStatic(_Theme.SongMenuTileBoard.StaticDuetIcon, _PartyModeID);
|
||||||
_VideoIcon = new CStatic(_Theme.SongMenuTileBoard.StaticVideoIcon, _PartyModeID);
|
_VideoIcon = new CStatic(_Theme.SongMenuTileBoard.StaticVideoIcon, _PartyModeID);
|
||||||
_MedleyCalcIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyCalcIcon, _PartyModeID);
|
_MedleyCalcIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyCalcIcon, _PartyModeID);
|
||||||
_MedleyTagIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyTagIcon, _PartyModeID);
|
_MedleyTagIcon = new CStatic(_Theme.SongMenuTileBoard.StaticMedleyTagIcon, _PartyModeID);
|
||||||
_SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
|
_SubElements.AddRange(new IMenuElement[] {_Artist, _Title, _SongLength, _SongYear, _DuetIcon, _VideoIcon, _MedleyCalcIcon, _MedleyTagIcon});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void _UpdateTileSelection()
|
private void _UpdateTileSelection()
|
||||||
@@ -135,6 +137,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
{
|
{
|
||||||
_Theme.SongMenuTileBoard.TextArtist = (SThemeText)_Artist.GetTheme();
|
_Theme.SongMenuTileBoard.TextArtist = (SThemeText)_Artist.GetTheme();
|
||||||
_Theme.SongMenuTileBoard.TextSongLength = (SThemeText)_SongLength.GetTheme();
|
_Theme.SongMenuTileBoard.TextSongLength = (SThemeText)_SongLength.GetTheme();
|
||||||
|
_Theme.SongMenuTileBoard.TextSongYear = (SThemeText)_SongYear.GetTheme();
|
||||||
_Theme.SongMenuTileBoard.TextTitle = (SThemeText)_Title.GetTheme();
|
_Theme.SongMenuTileBoard.TextTitle = (SThemeText)_Title.GetTheme();
|
||||||
_Theme.SongMenuTileBoard.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
|
_Theme.SongMenuTileBoard.StaticCoverBig = (SThemeStatic)_CoverBig.GetTheme();
|
||||||
_Theme.SongMenuTileBoard.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
|
_Theme.SongMenuTileBoard.StaticDuetIcon = (SThemeStatic)_DuetIcon.GetTheme();
|
||||||
@@ -208,6 +211,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
_Artist.Text = String.Empty;
|
_Artist.Text = String.Empty;
|
||||||
_Title.Text = String.Empty;
|
_Title.Text = String.Empty;
|
||||||
_SongLength.Text = String.Empty;
|
_SongLength.Text = String.Empty;
|
||||||
|
_SongYear.Text = String.Empty;
|
||||||
_DuetIcon.Visible = false;
|
_DuetIcon.Visible = false;
|
||||||
_VideoIcon.Visible = false;
|
_VideoIcon.Visible = false;
|
||||||
_MedleyCalcIcon.Visible = false;
|
_MedleyCalcIcon.Visible = false;
|
||||||
@@ -236,6 +240,7 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
_CoverBig.Texture = song.CoverTextureBig;
|
_CoverBig.Texture = song.CoverTextureBig;
|
||||||
_Artist.Text = song.Artist;
|
_Artist.Text = song.Artist;
|
||||||
_Title.Text = song.Title;
|
_Title.Text = song.Title;
|
||||||
|
_SongYear.Text = song.Year;
|
||||||
_DuetIcon.Visible = song.IsDuet;
|
_DuetIcon.Visible = song.IsDuet;
|
||||||
_VideoIcon.Visible = song.VideoFileName != "";
|
_VideoIcon.Visible = song.VideoFileName != "";
|
||||||
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
|
_MedleyCalcIcon.Visible = song.Medley.Source == EDataSource.Calculated;
|
||||||
@@ -335,19 +340,55 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.PageUp:
|
case Keys.PageUp:
|
||||||
if (catChangePossible)
|
if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
|
||||||
{
|
{
|
||||||
_PrevCategory();
|
_PrevCategory();
|
||||||
keyEvent.Handled = true;
|
keyEvent.Handled = true;
|
||||||
}
|
}
|
||||||
|
else if (moveAllowed)
|
||||||
|
{
|
||||||
|
int numSongsPerPage = _NumH * _NumW;
|
||||||
|
if ((_SelectionNr - numSongsPerPage) <= 0)
|
||||||
|
_SelectionNr = 0;
|
||||||
|
else
|
||||||
|
_SelectionNr = _SelectionNr - numSongsPerPage;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.PageDown:
|
case Keys.PageDown:
|
||||||
if (catChangePossible)
|
if (catChangePossible && CBase.Songs.IsInCategory() && (keyEvent.Mod == EModifier.Ctrl || keyEvent.Mod == EModifier.Alt))
|
||||||
{
|
{
|
||||||
_NextCategory();
|
_NextCategory();
|
||||||
keyEvent.Handled = true;
|
keyEvent.Handled = true;
|
||||||
}
|
}
|
||||||
|
else if (moveAllowed)
|
||||||
|
{
|
||||||
|
int numSongsPerPage = _NumH * _NumW;
|
||||||
|
int maxCount_PageDown = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
|
||||||
|
if ((_SelectionNr + numSongsPerPage) >= maxCount_PageDown)
|
||||||
|
_SelectionNr = maxCount_PageDown - 1;
|
||||||
|
else
|
||||||
|
_SelectionNr = _SelectionNr + numSongsPerPage;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.Home:
|
||||||
|
if (moveAllowed)
|
||||||
|
{
|
||||||
|
_SelectionNr = 0;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Keys.End:
|
||||||
|
int maxCount_End = (CBase.Songs.GetTabs() == EOffOn.TR_CONFIG_ON && !CBase.Songs.IsInCategory() ? CBase.Songs.GetNumCategories() : CBase.Songs.GetNumSongsVisible());
|
||||||
|
if (moveAllowed)
|
||||||
|
{
|
||||||
|
_SelectionNr = maxCount_End - 1;
|
||||||
|
keyEvent.Handled = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.Left:
|
case Keys.Left:
|
||||||
@@ -485,7 +526,9 @@ namespace VocaluxeLib.Menu.SongMenu
|
|||||||
|
|
||||||
_TextBG.Draw();
|
_TextBG.Draw();
|
||||||
|
|
||||||
CTextureRef vidtex = CBase.BackgroundMusic.IsPlayingPreview() ? CBase.BackgroundMusic.GetVideoTexture() : null;
|
CTextureRef vidtex = null;
|
||||||
|
if (CBase.Config.GetVideoPreview() == EOffOn.TR_CONFIG_ON)
|
||||||
|
vidtex = (CBase.BackgroundMusic.IsPlayingPreview() ? CBase.BackgroundMusic.GetVideoTexture() : null);
|
||||||
|
|
||||||
if (vidtex != null)
|
if (vidtex != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ namespace VocaluxeLib.Songs
|
|||||||
public readonly List<string> BackgroundFileNames = new List<string>();
|
public readonly List<string> BackgroundFileNames = new List<string>();
|
||||||
public string VideoFileName = String.Empty;
|
public string VideoFileName = String.Empty;
|
||||||
|
|
||||||
public EAspect VideoAspect = EAspect.Crop;
|
public EAspect VideoAspect = EAspect.Automatic;
|
||||||
|
|
||||||
public bool NotesLoaded { get; private set; }
|
public bool NotesLoaded { get; private set; }
|
||||||
|
|
||||||
@@ -288,6 +288,17 @@ namespace VocaluxeLib.Songs
|
|||||||
return loader.ReadNotes();
|
return loader.ReadNotes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ReloadSong(bool reloadNotes)
|
||||||
|
{
|
||||||
|
var loader = new CSongLoader(this);
|
||||||
|
bool retValue = loader.ReadHeader();
|
||||||
|
if (!retValue)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
retValue = loader.ReadNotes(reloadNotes);
|
||||||
|
return retValue;
|
||||||
|
}
|
||||||
|
|
||||||
public bool Save()
|
public bool Save()
|
||||||
{
|
{
|
||||||
return Save(Path.Combine(Folder, FileName));
|
return Save(Path.Combine(Folder, FileName));
|
||||||
|
|||||||
@@ -82,12 +82,16 @@ namespace VocaluxeLib.Songs
|
|||||||
_Song.Languages.Clear();
|
_Song.Languages.Clear();
|
||||||
_Song.Genres.Clear();
|
_Song.Genres.Clear();
|
||||||
_Song.UnknownTags.Clear();
|
_Song.UnknownTags.Clear();
|
||||||
|
_Song.BackgroundFileNames.Clear();
|
||||||
_Song._Comment = "";
|
_Song._Comment = "";
|
||||||
_Song.ManualEncoding = false;
|
_Song.ManualEncoding = false;
|
||||||
_Song.Medley.Source = EDataSource.None;
|
_Song.Medley.Source = EDataSource.None;
|
||||||
_Song._CalculateMedley = true;
|
_Song._CalculateMedley = true;
|
||||||
_Song.Preview.Source = EDataSource.None;
|
_Song.Preview.Source = EDataSource.None;
|
||||||
_Song.ShortEnd.Source = EDataSource.None;
|
_Song.ShortEnd.Source = EDataSource.None;
|
||||||
|
_Song.Start = 0;
|
||||||
|
_Song.VideoGap = 0;
|
||||||
|
_Song.Preview.StartTime = 0;
|
||||||
|
|
||||||
var headerFlags = new EHeaderFlags();
|
var headerFlags = new EHeaderFlags();
|
||||||
StreamReader sr = null;
|
StreamReader sr = null;
|
||||||
@@ -567,6 +571,8 @@ namespace VocaluxeLib.Songs
|
|||||||
case ':':
|
case ':':
|
||||||
case '*':
|
case '*':
|
||||||
case 'F':
|
case 'F':
|
||||||
|
case 'R': // Read R (RAP) and G (Golden RAP) notes as Freestyle notes currently. Final implementation needed!
|
||||||
|
case 'G': // Read R (RAP) and G (Golden RAP) notes as Freestyle notes currently. Final implementation needed!
|
||||||
string[] noteData = line.Split(splitChars, 4);
|
string[] noteData = line.Split(splitChars, 4);
|
||||||
if (noteData.Length < 4)
|
if (noteData.Length < 4)
|
||||||
{
|
{
|
||||||
@@ -614,7 +620,7 @@ namespace VocaluxeLib.Songs
|
|||||||
|
|
||||||
if (tag.Equals('*'))
|
if (tag.Equals('*'))
|
||||||
noteType = ENoteType.Golden;
|
noteType = ENoteType.Golden;
|
||||||
else if (tag.Equals('F'))
|
else if (tag.Equals('F') || tag.Equals('R') || tag.Equals('G')) // Read R (RAP) and G (Golden RAP) notes as Freestyle notes currently. Final implementation needed!
|
||||||
noteType = ENoteType.Freestyle;
|
noteType = ENoteType.Freestyle;
|
||||||
else
|
else
|
||||||
noteType = ENoteType.Normal;
|
noteType = ENoteType.Normal;
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ namespace VocaluxeLib.Utils.Player
|
|||||||
|
|
||||||
if (_Video != null || !SongHasVideo)
|
if (_Video != null || !SongHasVideo)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
string videoFilePath = Path.Combine(_Song.Folder, _Song.VideoFileName);
|
string videoFilePath = Path.Combine(_Song.Folder, _Song.VideoFileName);
|
||||||
_Video = CBase.Video.Load(videoFilePath);
|
_Video = CBase.Video.Load(videoFilePath);
|
||||||
if (_Video == null)
|
if (_Video == null)
|
||||||
|
|||||||
+2
-2
@@ -136,7 +136,7 @@ deploy:
|
|||||||
release: $(APPVEYOR_REPO_TAG_NAME)
|
release: $(APPVEYOR_REPO_TAG_NAME)
|
||||||
description: $(APPVEYOR_REPO_COMMIT)
|
description: $(APPVEYOR_REPO_COMMIT)
|
||||||
auth_token:
|
auth_token:
|
||||||
secure: JSlN/em0JdspVn8jwaQ4IjugY6OQi0au4Qq0rhctJmcfGMaEGnUAOmDFULI48REW
|
secure: sGetWh2XUYs95VBT+QYNPtDW9Rh2/JBuxNNYXytpn7mMudUMcjSKDGErkCTum+ZE
|
||||||
artifact: ReleaseZip
|
artifact: ReleaseZip
|
||||||
prerelease: $(IS_BETA_RELEASE)
|
prerelease: $(IS_BETA_RELEASE)
|
||||||
on:
|
on:
|
||||||
@@ -148,7 +148,7 @@ deploy:
|
|||||||
release: Latest Nightly build
|
release: Latest Nightly build
|
||||||
description: $(APPVEYOR_REPO_COMMIT)
|
description: $(APPVEYOR_REPO_COMMIT)
|
||||||
auth_token:
|
auth_token:
|
||||||
secure: JSlN/em0JdspVn8jwaQ4IjugY6OQi0au4Qq0rhctJmcfGMaEGnUAOmDFULI48REW
|
secure: sGetWh2XUYs95VBT+QYNPtDW9Rh2/JBuxNNYXytpn7mMudUMcjSKDGErkCTum+ZE
|
||||||
artifact: ReleaseZip
|
artifact: ReleaseZip
|
||||||
prerelease: true
|
prerelease: true
|
||||||
on:
|
on:
|
||||||
|
|||||||
Reference in new issue
Block a user