aboutsummaryrefslogtreecommitdiffstats
path: root/Game
diff options
context:
space:
mode:
Diffstat (limited to 'Game')
-rw-r--r--Game/Changelog.german.txt28
-rw-r--r--Game/Changelog.txt28
-rw-r--r--Game/Code/Classes/UGraphic.pas8
-rw-r--r--Game/Code/Classes/UVideo.pas17
-rw-r--r--Game/Code/UltraStar.bdsproj17
-rw-r--r--Game/Code/UltraStar.cfg18
-rw-r--r--Game/Code/UltraStar.dpr2
-rw-r--r--Game/Code/lib/acinerella/acinerella.c501
-rw-r--r--Game/Code/lib/acinerella/acinerella.h8
-rw-r--r--Game/Code/lib/acinerella/acinerella.pas10
-rw-r--r--Game/Output/Changelog.german.txt28
-rw-r--r--Game/Output/Changelog.txt28
-rw-r--r--Game/Output/Languages/Dutch.ini415
-rw-r--r--Game/Output/acinerella.dllbin6486035 -> 6077459 bytes
14 files changed, 851 insertions, 257 deletions
diff --git a/Game/Changelog.german.txt b/Game/Changelog.german.txt
index 032fc69e..795c1ffd 100644
--- a/Game/Changelog.german.txt
+++ b/Game/Changelog.german.txt
@@ -1,3 +1,31 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r7c vom 01.05.2010
+-----------------------------
+Fix: (Videos) Einige Probleme im Zusammenhang mit wmv-Videos beseitigt.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7b vom 29.04.2010
+-----------------------------
+Add: (Allgemein) Niederländische übersetzung hinzugefügt (thx to Bruut)
+Add: (Theme) Blue Sensation als Standard-Theme.
+Add: (Themes) Fehlende Dateien für Theme iStar hinzugefügt.
+New: (Allgemein) Bei Spielstart werden im Ladebild die Anzahl der aktuell gefundenen Songs aufgelistet.
+New: (Allgemein) Shuffle Modus: Wenn man in der Songauswahl nichts macht, so wird nach einer voreingestellten Zeit zu einem zufällig ausgewählten Lied gesprungen. Einstellen kann man Off, 15s, 30s, ..., 120s und MAX. Bei MAX wird das Lied immer erst zu Ende gespielt.
+New: (Allgemein) Sortierung und Ordnerstruktur wird ohne Neustart übernommen.
+New: (Party) Mit STRG+*(Numlock) oder STRG+R werden die Namen bei der Namenseingabe durcheinandergewürfelt (von merc).
+New: (Party) Wenn man "NewPartyPoints" auf On in der INI setzt, so bekommt das Siegerteam 2 Punkte, das zweite Team einen Punkt wenn man mit drei Teams spielt (von merc).
+New: (Videos) Dynamische, abschaltbare Video-FPS Anpassung (bei langsamen Grafikkarten wie Intels GMA im zusammenhang mit HD-Videos). Abzustellen mit "PerformanceMode=Off".
+Fix: (Allgemein) Kein Absturz mehr unter Vista/Win7 wenn man das Spiel ohne Mic startet.
+Fix: (Allgemein) LoadFaultySongs=On wurde nach einem Neustart mit Off überschrieben
+Fix: (Allgemein) Verbessertes Fading und Videodarstellung bei benutzung von zwei Bildschirmen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7a vom 06.03.2010
+-----------------------------
+Add: (Editor) Negativer VideoGap wird unterstützt.
+Add: (Themes) Blue Sensation und iStar Themes hinzugefügt (thx to gpm).
+Upd: (Allgemein) Freestyle-Noten der Länge Null werden nicht mehr als Fehler eingestuft.
+Upd: (Editor) Theme nun zu 100% fest einprogrammiert. Ist dadurch kompatibler mit den anderen Themes.
+Upd: (Videos) Videosuchlauf in SingScreen nun genau so, wie in VideoPreview. Nicht schön aber schneller.
+Fix: (Party) Übersprungene Lieder wurden fälschlicherweise in der nächsten Runde nicht mehr angezeigt.
+
Ultrastar Deluxe v1.0.1a Challenge MOD r7 vom 04.03.2010
-----------------------------
New: (Allgemein) Experimentelle Karaoke-Funktion (Singstimme ausblenden, bitte nicht zu ernst nehmen): mit K ein/ausschalten
diff --git a/Game/Changelog.txt b/Game/Changelog.txt
index 7257c952..2714cbce 100644
--- a/Game/Changelog.txt
+++ b/Game/Changelog.txt
@@ -1,3 +1,31 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r7c (01.05.2010)
+-----------------------------
+Fix: (Videos) Fixed some problems with wmv-videos.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7b (29.04.2010)
+-----------------------------
+Add: (General) Added dutch translation (thx to Bruut).
+Add: (Theme) Blue Sensation is now the default theme.
+Add: (Themes) Added missing files for iStar theme.
+New: (General) The loading screen shows a song-counter.
+New: (General) You can turn on ShuffleMode in game options: The game shuffles songs if you idle in song screen.
+New: (General) You can change the sorting and tabs on/off without the need of restarting.
+New: (Party) Press Left-Ctrl + * (* on Numpad) or CTRL+R to Shuffle Player Names in Classic Party Mode "Team- and Player Names"-Screen (by merc).
+New: (Party) Set "NewPartyPoints" in config.ini to "On" to give Winner Team 2Points and 2nd placed Team 1Point while playing with 3 Teams (by merc).
+New: (Videos) Dynamic video-fps adaption: For slow graphic chips like intel GMA. You can turn it off by "PerformanceMode=Off"
+Fix: (General) Vista/Win7 does not crash any more if you dont have a mic.
+Fix: (General) LoadFaultySongs=On has been overwritten with "Off" after a restart.
+Fix: (General) Better fading and video drawing when using two screens.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7a (06.03.2010)
+-----------------------------
+Add: (Editor) Support for negative video gap.
+Add: (Themes) Added Blue Sensation and iStar Themes (thx to gpm).
+Upd: (General) Freestyle-Notes with zero length are no longer marked as a fault.
+Upd: (Editor) The editor theme is now 100% hardcoded. Its for compatibility with the other themes.
+Upd: (Videos) Faster seeking of video preview position.
+Fix: (Party) Skipped songs were not shown in the next round.
+
Ultrastar Deluxe v1.0.1a Challenge MOD r7 (04.03.2010)
-----------------------------
New: (General) Experimental karaoke function (tries to hide the singing voice, please don't take it too seriously): enable/disable with "K"
diff --git a/Game/Code/Classes/UGraphic.pas b/Game/Code/Classes/UGraphic.pas
index 563873a5..4aed06f3 100644
--- a/Game/Code/Classes/UGraphic.pas
+++ b/Game/Code/Classes/UGraphic.pas
@@ -405,7 +405,7 @@ begin
SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 8 );
pbo_supported := false;
- if (Ini.EnablePBO=1) then
+ {if (Ini.EnablePBO=1) then
begin
try
pbo_supported := glext_LoadExtension('GL_ARB_pixel_buffer_object') and
@@ -414,7 +414,7 @@ begin
pbo_supported := false;
Log.LogError('The device does not support Pixel Buffer Object (UVideo)!');
end;
- end;
+ end;}
if (Ini.FullScreen = 0) and (Not Params.FullScreen) then
screen := SDL_SetVideoMode(W, H, (Depth+1) * 16, videoFlags)
@@ -427,9 +427,7 @@ begin
Log.LogError('SDL_SetVideoMode Failed', 'Initialize3D');
exit;
end;
-
-
-
+
// clear screen once window is being shown
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/Game/Code/Classes/UVideo.pas b/Game/Code/Classes/UVideo.pas
index 25c13886..97c1e79b 100644
--- a/Game/Code/Classes/UVideo.pas
+++ b/Game/Code/Classes/UVideo.pas
@@ -232,7 +232,8 @@ begin
fAspect := VideoAspect;
- VideoTimeBase:=info.additional_info.video_info.frames_per_second;
+ if (info.additional_info.video_info.frames_per_second>0) then
+ VideoTimeBase:=1/info.additional_info.video_info.frames_per_second;
glBindTexture(GL_TEXTURE_2D, VideoTex);
@@ -290,10 +291,20 @@ begin
if Start+Gap > 0 then
begin
VideoTime:=Start+Gap;
- ac_seek(videodecoder, -1, Floor((Start+Gap)*1000));
+ try
+ ac_seek(videodecoder, -1, Floor((Start+Gap)*1000));
+ except
+ Log.LogError('Error seeking Video "acSkip2" on video ('+fName+')');
+ acClose;
+ end;
end else
begin
- ac_seek(videodecoder, 0, 0);
+ try
+ ac_seek(videodecoder, 0, 0);
+ except
+ Log.LogError('Error seeking Video "acSkip2" on video ('+fName+')');
+ acClose;
+ end;
VideoTime:=0;
end;
end;
diff --git a/Game/Code/UltraStar.bdsproj b/Game/Code/UltraStar.bdsproj
index 64cad021..acdabdad 100644
--- a/Game/Code/UltraStar.bdsproj
+++ b/Game/Code/UltraStar.bdsproj
@@ -18,8 +18,8 @@
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
- <Compiler Name="C">0</Compiler>
- <Compiler Name="D">0</Compiler>
+ <Compiler Name="C">1</Compiler>
+ <Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
@@ -27,7 +27,7 @@
<Compiler Name="I">1</Compiler>
<Compiler Name="J">0</Compiler>
<Compiler Name="K">0</Compiler>
- <Compiler Name="L">0</Compiler>
+ <Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
@@ -38,9 +38,9 @@
<Compiler Name="T">0</Compiler>
<Compiler Name="U">1</Compiler>
<Compiler Name="V">1</Compiler>
- <Compiler Name="W">1</Compiler>
+ <Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
- <Compiler Name="Y">0</Compiler>
+ <Compiler Name="Y">2</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
@@ -123,7 +123,7 @@
<Directories Name="UnitOutputDir">..\Units</Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
- <Directories Name="SearchPath">lib\JEDI-SDLv1.0\SDL\Pas</Directories>
+ <Directories Name="SearchPath">$(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;lib\JEDI-SDLv1.0\SDL\Pas</Directories>
<Directories Name="Packages">vclx;vcl;rtl;dbrtl;vcldb;adortl;dbxcds;dbexpress;xmlrtl;vclie;inet;inetdbbde;inetdbxpress;dclOfficeXP;soaprtl;dsnap;vclactnband;bdertl;vcldbx</Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
@@ -136,7 +136,7 @@
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
- <Parameters Name="LoadAllSymbols">False</Parameters>
+ <Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
@@ -170,7 +170,8 @@
<VersionInfoKeys Name="ProductName"></VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"></VersionInfoKeys>
- </VersionInfoKeys> <Excluded_Packages>
+ </VersionInfoKeys>
+ <Excluded_Packages>
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclib100.bpl">Borland InterBase Express Components</Excluded_Packages>
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclIntraweb_80_100.bpl">Intraweb 8.0 Design Package for Borland Development Studio 2006</Excluded_Packages>
<Excluded_Packages Name="c:\program files (x86)\borland\bds\4.0\Bin\dclIndyCore100.bpl">Indy 10 Core Design Time</Excluded_Packages>
diff --git a/Game/Code/UltraStar.cfg b/Game/Code/UltraStar.cfg
index 7e2ddcc4..e156555a 100644
--- a/Game/Code/UltraStar.cfg
+++ b/Game/Code/UltraStar.cfg
@@ -1,7 +1,7 @@
-$A8
-$B-
--$C-
--$D-
+-$C+
+-$D+
-$E-
-$F-
-$G+
@@ -9,7 +9,7 @@
-$I+
-$J-
-$K-
--$L-
+-$L+
-$M-
-$N+
-$O+
@@ -20,9 +20,9 @@
-$T-
-$U+
-$V+
--$W+
+-$W-
-$X+
--$Y-
+-$Y+
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
@@ -35,10 +35,10 @@
-N0"..\Units"
-LE"C:\Users\Alex\Documents\Borland Studio-Projekte\Bpl"
-LN"C:\Users\Alex\Documents\Borland Studio-Projekte\Bpl"
--U"lib\JEDI-SDLv1.0\SDL\Pas"
--O"lib\JEDI-SDLv1.0\SDL\Pas"
--I"lib\JEDI-SDLv1.0\SDL\Pas"
--R"lib\JEDI-SDLv1.0\SDL\Pas"
+-U"c:\program files (x86)\borland\bds\4.0\lib\Debug;c:\program files (x86)\borland\bds\4.0\Lib\Debug\Indy10;lib\JEDI-SDLv1.0\SDL\Pas"
+-O"c:\program files (x86)\borland\bds\4.0\lib\Debug;c:\program files (x86)\borland\bds\4.0\Lib\Debug\Indy10;lib\JEDI-SDLv1.0\SDL\Pas"
+-I"c:\program files (x86)\borland\bds\4.0\lib\Debug;c:\program files (x86)\borland\bds\4.0\Lib\Debug\Indy10;lib\JEDI-SDLv1.0\SDL\Pas"
+-R"c:\program files (x86)\borland\bds\4.0\lib\Debug;c:\program files (x86)\borland\bds\4.0\Lib\Debug\Indy10;lib\JEDI-SDLv1.0\SDL\Pas"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr
index 7cc5cfd8..6ddbad56 100644
--- a/Game/Code/UltraStar.dpr
+++ b/Game/Code/UltraStar.dpr
@@ -124,7 +124,7 @@ uses
acinerella in 'lib\acinerella\acinerella.pas';
const
- Version = 'UltraStar Deluxe v1.0.1a Challenge-Mod r7b RC2 2010-04-28';
+ Version = 'UltraStar Deluxe v1.0.1a Challenge-Mod r7c 2010-05-01';
var
WndTitle: string;
diff --git a/Game/Code/lib/acinerella/acinerella.c b/Game/Code/lib/acinerella/acinerella.c
index ef03e98e..05c52232 100644
--- a/Game/Code/lib/acinerella/acinerella.c
+++ b/Game/Code/lib/acinerella/acinerella.c
@@ -27,8 +27,12 @@
#define AUDIO_BUFFER_BASE_SIZE ((AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2)
+
//This struct represents one Acinerella video object.
//It contains data needed by FFMpeg.
+
+#define AC_BUFSIZE 1024*64
+
struct _ac_data {
ac_instance instance;
@@ -40,8 +44,8 @@ struct _ac_data {
ac_seek_callback seek_proc;
ac_openclose_callback close_proc;
- URLProtocol protocol;
- char protocol_name[9];
+ ByteIOContext io;
+ void* buffer;
};
typedef struct _ac_data ac_data;
@@ -92,60 +96,6 @@ typedef struct _ac_package_data ac_package_data;
typedef ac_package_data* lp_ac_package_data;
//
-//---Small functions that are missing in FFMpeg ;-) ---
-//
-
-//Deletes a protocol from the FFMpeg protocol list
-void unregister_protocol(URLProtocol *protocol) {
- URLProtocol *pcurrent = first_protocol;
- URLProtocol *plast = NULL;
-
- while (pcurrent != NULL) {
- //Search for the protocol that is given as parameter
- if (pcurrent == protocol) {
- if (plast != NULL) {
- plast->next = pcurrent->next;
- return;
- } else {
- first_protocol = pcurrent->next;
- return;
- }
- }
- plast = pcurrent;
- pcurrent = pcurrent->next;
- }
-}
-
-void unique_protocol_name(char *name) {
- URLProtocol *p = first_protocol;
- int i = 0;
-
- //Copy the string "acinx" to the string
- strcpy(name, "acinx");
-
- while (1) {
- //Replace the "x" in the string with a character
- name[4] = (char)(65 + i);
-
- while (1) {
- //There is no element in the list or we are at the end of the list. In this case the string
- //is unique
- if (p == NULL) {
- return;
- }
- //We got an element from the list, compare its name to our string. If they are the same,
- //the string isn't unique and we have to create a new one.
- if (strcmp(p->name, name) == 0) {
- p = first_protocol;
- break;
- }
- p = p->next;
- }
- i++;
- }
-}
-
-//
//--- Memory manager ---
//
@@ -153,7 +103,9 @@ ac_malloc_callback mgr_malloc = &malloc;
ac_realloc_callback mgr_realloc = &realloc;
ac_free_callback mgr_free = &free;
-void CALL_CONVT ac_mem_mgr(ac_malloc_callback mc, ac_realloc_callback rc, ac_free_callback fc) {
+void CALL_CONVT ac_mem_mgr(ac_malloc_callback mc, ac_realloc_callback rc,
+ ac_free_callback fc)
+{
mgr_malloc = mc;
mgr_realloc = rc;
mgr_free = fc;
@@ -163,7 +115,8 @@ void CALL_CONVT ac_mem_mgr(ac_malloc_callback mc, ac_realloc_callback rc, ac_fre
//--- Initialization and Stream opening---
//
-void init_info(lp_ac_file_info info) {
+void init_info(lp_ac_file_info info)
+{
info->title[0] = 0;
info->author[0] = 0;
info->copyright[0] = 0;
@@ -178,11 +131,16 @@ void init_info(lp_ac_file_info info) {
lp_ac_instance CALL_CONVT ac_init(void) {
//Initialize FFMpeg libraries
+ avcodec_register_all();
av_register_all();
//Allocate a new instance of the videoplayer data and return it
lp_ac_data ptmp;
ptmp = (lp_ac_data)mgr_malloc(sizeof(ac_data));
+
+ //Initialize the created structure
+ memset(ptmp, 0, sizeof(ac_data));
+
ptmp->instance.opened = 0;
ptmp->instance.stream_count = 0;
ptmp->instance.output_format = AC_OUTPUT_BGR24;
@@ -201,40 +159,57 @@ void CALL_CONVT ac_free(lp_ac_instance pacInstance) {
lp_ac_data last_instance;
-//Function called by FFMpeg when opening an ac stream.
-static int file_open(URLContext *h, const char *filename, int flags)
+static int io_read(void *opaque, uint8_t *buf, int buf_size)
{
- h->priv_data = last_instance;
- h->is_streamed = last_instance->seek_proc == NULL;
-
- if (last_instance->open_proc != NULL) {
- last_instance->open_proc(last_instance->sender);
+ if (((lp_ac_data)(opaque))->read_proc != NULL) {
+ return ((lp_ac_data)(opaque))->read_proc(
+ ((lp_ac_data)(opaque))->sender, buf, buf_size);
}
-
- return 0;
+
+ return -1;
}
-//Function called by FFMpeg when reading from the stream
-static int file_read(URLContext *h, unsigned char *buf, int size)
+static int64_t io_seek(void *opaque, int64_t pos, int whence)
{
- if (((lp_ac_data)(h->priv_data))->read_proc != NULL) {
- return ((lp_ac_data)(h->priv_data))->read_proc(((lp_ac_data)(h->priv_data))->sender, buf, size);
+ if (((lp_ac_data)(opaque))->seek_proc != NULL) {
+ if ((whence >= 0) && (whence <= 2)) {
+ return ((lp_ac_data)(opaque))->seek_proc(
+ ((lp_ac_data)(opaque))->sender, pos, whence);
+ }
}
-
+
return -1;
}
-//Function called by FFMpeg when seeking the stream
-
-int64_t file_seek(URLContext *h, int64_t pos, int whence)
+static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int *score_max)
{
- if ((whence >= 0) && (whence <= 2)) {
- if (((lp_ac_data)(h->priv_data))->seek_proc != NULL) {
- return ((lp_ac_data)(h->priv_data))->seek_proc(((lp_ac_data)(h->priv_data))->sender, pos, whence);
- }
- }
+ AVInputFormat *fmt1, *fmt;
+ int score;
- return -1;
+ fmt = NULL;
+ for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
+ score = 0;
+
+ //Only handle formats which require a file to be opened (test)
+ if (fmt1->flags & AVFMT_NOFILE) {
+ continue;
+ }
+
+ if (fmt1->read_probe) {
+ score = fmt1->read_probe(pd);
+ } else if (fmt1->extensions) {
+ if (av_match_ext(pd->filename, fmt1->extensions)) {
+ score = 50;
+ }
+ }
+ if (score > *score_max) {
+ *score_max = score;
+ fmt = fmt1;
+ } else if (score == *score_max) {
+ fmt = NULL;
+ }
+ }
+ return fmt;
}
uint64_t global_video_pkt_pts = AV_NOPTS_VALUE;
@@ -252,14 +227,79 @@ void ac_release_buffer(struct AVCodecContext *c, AVFrame *pic){
avcodec_default_release_buffer(c, pic);
}
-//Function called by FFMpeg when the stream should be closed
-static int file_close(URLContext *h)
+AVInputFormat* ac_probe_input_buffer(
+ char* buf,
+ int bufsize,
+ char* filename,
+ int* score_max)
{
- if (((lp_ac_data)(h->priv_data))->close_proc != NULL) {
- return ((lp_ac_data)(h->priv_data))->close_proc(((lp_ac_data)(h->priv_data))->sender);
- }
+ AVProbeData pd;
+
+ //Set the filename
+ pd.filename = "";
+ if (filename) {
+ pd.filename = filename;
+ }
- return 0;
+ //Set the probe data buffer
+ pd.buf = buf;
+ pd.buf_size = bufsize;
+
+ //Test it
+ return av_probe_input_format2(&pd, score_max);
+}
+
+#define PROBE_BUF_MIN 2048
+#define PROBE_BUF_MAX (1<<20)
+
+AVInputFormat* ac_probe_input_stream(
+ void* sender,
+ ac_read_callback read_proc,
+ char* filename,
+ void* *buf,
+ int* buf_read)
+{
+ //Initialize the result variables
+ AVInputFormat* fmt = NULL;
+ *buf_read = 0;
+ *buf = NULL;
+ int last_iteration = 0;
+ int probe_size = 0;
+
+ for (probe_size = PROBE_BUF_MIN;
+ (probe_size <= PROBE_BUF_MAX) && !fmt && !last_iteration;
+ probe_size<<=1) {
+ int score = AVPROBE_SCORE_MAX / 4;
+
+ //Allocate some memory for the current probe buffer
+ void* tmp_buf = av_malloc(probe_size);
+
+ //Copy the old data to the new buffer
+ if (*buf) {
+ memcpy(tmp_buf, *buf, *buf_read);
+ //Free the old data memory
+ av_free(*buf);
+ }
+
+ //Read the new data
+ void* write_ptr = tmp_buf + *buf_read;
+ int read_size = probe_size - *buf_read;
+ int size;
+ if (size = read_proc(sender, write_ptr, read_size) < read_size) {
+ last_iteration = 1;
+ probe_size = *buf_read + size;
+ }
+
+ //Probe it
+ fmt = ac_probe_input_buffer(tmp_buf, probe_size, filename, &score);
+
+ //Set the new buffer
+ *buf = tmp_buf;
+ *buf_read = probe_size;
+ }
+
+ //Return the result
+ return fmt;
}
int CALL_CONVT ac_open(
@@ -268,8 +308,8 @@ int CALL_CONVT ac_open(
ac_openclose_callback open_proc,
ac_read_callback read_proc,
ac_seek_callback seek_proc,
- ac_openclose_callback close_proc) {
-
+ ac_openclose_callback close_proc)
+{
pacInstance->opened = 0;
//Set last instance
@@ -280,48 +320,57 @@ int CALL_CONVT ac_open(
((lp_ac_data)pacInstance)->open_proc = open_proc;
((lp_ac_data)pacInstance)->read_proc = read_proc;
((lp_ac_data)pacInstance)->seek_proc = seek_proc;
- ((lp_ac_data)pacInstance)->close_proc = close_proc;
-
- //Create a new protocol name
- unique_protocol_name(((lp_ac_data)pacInstance)->protocol_name);
+ ((lp_ac_data)pacInstance)->close_proc = close_proc;
+
+ //Call the file open proc
+ if (open_proc != NULL) {
+ open_proc(sender);
+ }
- //Create a new protocol
- ((lp_ac_data)pacInstance)->protocol.name = ((lp_ac_data)pacInstance)->protocol_name;
- ((lp_ac_data)pacInstance)->protocol.url_open = &file_open;
- ((lp_ac_data)pacInstance)->protocol.url_read = &file_read;
- ((lp_ac_data)pacInstance)->protocol.url_write = NULL;
- if (!(seek_proc == NULL)) {
- ((lp_ac_data)pacInstance)->protocol.url_seek = &file_seek;
+ //Probe the input format
+ int probe_size = 0;
+ AVInputFormat* fmt = ac_probe_input_stream(sender, read_proc, "",
+ (void*)&((lp_ac_data)pacInstance)->buffer, &probe_size);
+
+ if (!fmt) return -1;
+
+
+ if (!seek_proc) {
+ init_put_byte(
+ &(((lp_ac_data)pacInstance)->io),
+ ((lp_ac_data)pacInstance)->buffer,
+ probe_size, 0, pacInstance, io_read, 0, NULL);
+ ((lp_ac_data)pacInstance)->io.is_streamed = 1;
+
+ //Feed the probed bytes into the IO-Context
+ ((lp_ac_data)pacInstance)->io.buf_end =
+ ((lp_ac_data)pacInstance)->buffer + probe_size;
+ ((lp_ac_data)pacInstance)->io.pos = probe_size;
} else {
- ((lp_ac_data)pacInstance)->protocol.url_seek = NULL;
+ //If the stream is seekable, seek back to the beginning of the stream and
+ //let FFMpeg start from the beginning
+ av_free(((lp_ac_data)pacInstance)->buffer);
+
+ seek_proc(sender, 0, SEEK_SET);
+
+ //Reserve AC_BUFSIZE Bytes of memory
+ ((lp_ac_data)pacInstance)->buffer = av_malloc(AC_BUFSIZE);
+
+ init_put_byte(
+ &(((lp_ac_data)pacInstance)->io),
+ ((lp_ac_data)pacInstance)->buffer,
+ AC_BUFSIZE, 0, pacInstance, io_read, 0, io_seek);
}
- ((lp_ac_data)pacInstance)->protocol.url_close = &file_close;
-
- //Register the generated protocol
- av_register_protocol(&((lp_ac_data)pacInstance)->protocol);
-
- //Generate a unique filename
- char filename[50];
- strcpy(filename, ((lp_ac_data)pacInstance)->protocol_name);
- strcat(filename, "://dummy.file");
- if(av_open_input_file(
- &(((lp_ac_data)pacInstance)->pFormatCtx), filename, NULL, 0, NULL) != 0 ) {
+ if(av_open_input_stream(&(((lp_ac_data)pacInstance)->pFormatCtx),
+ &(((lp_ac_data)pacInstance)->io), "", fmt, NULL) < 0)
+ {
return -1;
- }
-
+ }
+
//Retrieve stream information
- if(av_find_stream_info(((lp_ac_data)pacInstance)->pFormatCtx)<0) {
- return -1;
- }
-
- //Set some information in the instance variable
- pacInstance->stream_count = ((lp_ac_data)pacInstance)->pFormatCtx->nb_streams;
- pacInstance->opened = pacInstance->stream_count > 0;
-
- //Try to obtain even more stream information (duration, author, album etc.)
- if (av_find_stream_info(((lp_ac_data)pacInstance)->pFormatCtx) >= 0) {
- AVFormatContext *ctx = ((lp_ac_data)pacInstance)->pFormatCtx;
+ AVFormatContext *ctx = ((lp_ac_data)pacInstance)->pFormatCtx;
+ if(av_find_stream_info(ctx) >= 0) {
strcpy(pacInstance->info.title, ctx->title);
strcpy(pacInstance->info.author, ctx->author);
strcpy(pacInstance->info.copyright, ctx->copyright);
@@ -333,17 +382,37 @@ int CALL_CONVT ac_open(
pacInstance->info.track = ctx->track;
pacInstance->info.bitrate = ctx->bit_rate;
- pacInstance->info.duration = ctx->duration * 1000 / AV_TIME_BASE;
- }
+ pacInstance->info.duration = ctx->duration * 1000 / AV_TIME_BASE;
+ } else {
+ return -1;
+ }
+
+ //Set some information in the instance variable
+ pacInstance->stream_count = ((lp_ac_data)pacInstance)->pFormatCtx->nb_streams;
+ pacInstance->opened = pacInstance->stream_count > 0;
+
+ return 0;
}
void CALL_CONVT ac_close(lp_ac_instance pacInstance) {
- if (pacInstance->opened) {
- unregister_protocol(&((lp_ac_data)(pacInstance))->protocol);
- av_close_input_file(((lp_ac_data)(pacInstance))->pFormatCtx);
- pacInstance->opened = 0;
+ if (pacInstance->opened) {
+ //Close the opened file
+ if (((lp_ac_data)(pacInstance))->close_proc != NULL) {
+ ((lp_ac_data)(pacInstance))->close_proc(((lp_ac_data)(pacInstance))->sender);
+ }
+
+ av_close_input_stream(((lp_ac_data)(pacInstance))->pFormatCtx);
+ pacInstance->opened = 0;
+
+ /*
+ Auto freed by av_close_input_stream
+ if (((lp_ac_data)(pacInstance))->buffer) {
+ av_free(((lp_ac_data)(pacInstance))->buffer);
+ }*/
+
}
}
+
void CALL_CONVT ac_get_stream_info(lp_ac_instance pacInstance, int nb, lp_ac_stream_info info) {
if (!(pacInstance->opened)) {
return;
@@ -367,8 +436,8 @@ void CALL_CONVT ac_get_stream_info(lp_ac_instance pacInstance, int nb, lp_ac_str
}
info->additional_info.video_info.frames_per_second =
- (double)((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->r_frame_rate.den /
- (double)((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->r_frame_rate.num;
+ (double)((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->r_frame_rate.num /
+ (double)((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->r_frame_rate.den;
break;
case CODEC_TYPE_AUDIO:
//Set stream type to "AUDIO"
@@ -430,8 +499,6 @@ lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance) {
lp_ac_package_data pTmp = (lp_ac_package_data)(mgr_malloc(sizeof(ac_package_data)));
//Set package data
- pTmp->package.data = Package.data;
- pTmp->package.size = Package.size;
pTmp->package.stream_index = Package.stream_index;
pTmp->ffpackage = Package;
if (Package.dts != AV_NOPTS_VALUE) {
@@ -447,8 +514,12 @@ lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance) {
//Frees the currently loaded package
void CALL_CONVT ac_free_package(lp_ac_package pPackage) {
//Free the packet
- if (pPackage != NULL) {
- av_free_packet(&((lp_ac_package_data)pPackage)->ffpackage);
+ if (pPackage != NULL) {
+ AVPacket* pkt = &((lp_ac_package_data)pPackage)->ffpackage;
+ if (pkt) {
+ if (pkt->destruct) pkt->destruct(pkt);
+ pkt->data = NULL; pkt->size = 0;
+ }
mgr_free((lp_ac_package_data)pPackage);
}
}
@@ -478,8 +549,6 @@ void* ac_create_video_decoder(lp_ac_instance pacInstance, lp_ac_stream_info info
pDecoder->decoder.type = AC_DECODER_TYPE_VIDEO;
pDecoder->decoder.stream_index = nb;
pDecoder->pCodecCtx = ((lp_ac_data)(pacInstance))->pFormatCtx->streams[nb]->codec;
- pDecoder->pCodecCtx->get_buffer = ac_get_buffer;
- pDecoder->pCodecCtx->release_buffer = ac_release_buffer;
pDecoder->decoder.stream_info = *info;
//Find correspondenting codec
@@ -586,14 +655,11 @@ double ac_sync_video(lp_ac_package pPackage, lp_ac_decoder pDec, AVFrame *src_fr
int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder, lp_ac_decoder pDec) {
int finished;
double pts;
-
+
avcodec_decode_video2(
- pDecoder->pCodecCtx, pDecoder->pFrame, &finished,
- &((lp_ac_package_data)pPackage)->ffpackage);
+ pDecoder->pCodecCtx, pDecoder->pFrame, &finished,
+ &(((lp_ac_package_data)pPackage)->ffpackage));
-
-
-
if (finished) {
pts=0;
global_video_pkt_pts = ((lp_ac_package_data)pPackage)->ffpackage.pts;
@@ -615,69 +681,72 @@ int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder
pts = ac_sync_video(pPackage, pDec, pDecoder->pFrame, pts);
pDec->timecode = pts;
-/* img_convert(
- (AVPicture*)(pDecoder->pFrameRGB), convert_pix_format(pDecoder->decoder.pacInstance->output_format),
- (AVPicture*)(pDecoder->pFrame), pDecoder->pCodecCtx->pix_fmt,
- pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height);*/
-
+
pDecoder->pSwsCtx = sws_getCachedContext(pDecoder->pSwsCtx,
- pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt,
- pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, convert_pix_format(pDecoder->decoder.pacInstance->output_format),
- SWS_BICUBIC, NULL, NULL, NULL);
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt,
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, convert_pix_format(pDecoder->decoder.pacInstance->output_format),
+ SWS_BICUBIC, NULL, NULL, NULL);
- sws_scale(
- pDecoder->pSwsCtx,
- pDecoder->pFrame->data,
- pDecoder->pFrame->linesize,
- 0, //?
- pDecoder->pCodecCtx->height,
- pDecoder->pFrameRGB->data,
- pDecoder->pFrameRGB->linesize);
+ sws_scale(
+ pDecoder->pSwsCtx,
+ (uint8_t*)(pDecoder->pFrame->data),
+ pDecoder->pFrame->linesize,
+ 0, //?
+ pDecoder->pCodecCtx->height,
+ pDecoder->pFrameRGB->data,
+ pDecoder->pFrameRGB->linesize);
return 1;
}
return 0;
}
int ac_decode_audio_package(lp_ac_package pPackage, lp_ac_audio_decoder pDecoder) {
- int len1;
+ //Variables describing the destination buffer
int dest_buffer_size = pDecoder->max_buffer_size;
int dest_buffer_pos = 0;
- int size;
- uint8_t *src_buffer = pPackage->data;
- int src_buffer_size = pPackage->size;
- pDecoder->decoder.buffer_size = 0;
+ //An dummy package representing the source buffer
+ AVPacket pkt_tmp;
+ pkt_tmp.data = ((lp_ac_package_data)pPackage)->ffpackage.data;
+ pkt_tmp.size = ((lp_ac_package_data)pPackage)->ffpackage.size;
+
+ //Initialize the buffer size
+ pDecoder->decoder.buffer_size = 0;
+
+ while (pkt_tmp.size > 0) {
- while (src_buffer_size > 0) {
+ if (dest_buffer_size <= AUDIO_BUFFER_BASE_SIZE) {
+ pDecoder->decoder.pBuffer = mgr_realloc(pDecoder->decoder.pBuffer, pDecoder->max_buffer_size * 2);
+ dest_buffer_size += pDecoder->max_buffer_size;
+ pDecoder->max_buffer_size *= 2;
+ }
+
//Set the size of bytes that can be written to the current size of the destination buffer
- size = dest_buffer_size;
+ int size = dest_buffer_size;
//Decode a piece of the audio buffer. len1 contains the count of bytes read from the soure buffer.
- /*
- len1 = avcodec_decode_audio2(
- pDecoder->pCodecCtx, (uint16_t*)(pDecoder->decoder.pBuffer + dest_buffer_pos), &size,
- src_buffer, src_buffer_size);*/
+ int len1 = avcodec_decode_audio3(
+ pDecoder->pCodecCtx, (int16_t*)(pDecoder->decoder.pBuffer + dest_buffer_pos),
+ &size, &pkt_tmp
+ );
- len1 = avcodec_decode_audio3(
- pDecoder->pCodecCtx, (uint16_t*)(pDecoder->decoder.pBuffer + dest_buffer_pos), &size,
- &((lp_ac_package_data)pPackage)->ffpackage);
-
- src_buffer_size = pPackage->size - len1;
- src_buffer = pPackage->data + len1;
+ //If an error occured, skip the frame
+ if (len1 <= 0)
+ return 0;
+
+ if (size <= 0)
+ continue;
+
+ //Increment the source buffer pointers
+ pkt_tmp.size -= len1;
+ pkt_tmp.data += len1;
+ //Increment the destination buffer pointers
dest_buffer_size -= size;
dest_buffer_pos += size;
- pDecoder->decoder.buffer_size = dest_buffer_pos;
-
- if (dest_buffer_size <= AUDIO_BUFFER_BASE_SIZE) {
- pDecoder->decoder.pBuffer = mgr_realloc(pDecoder->decoder.pBuffer, pDecoder->max_buffer_size * 2);
- dest_buffer_size += pDecoder->max_buffer_size;
- pDecoder->max_buffer_size *= 2;
- }
+ pDecoder->decoder.buffer_size = dest_buffer_pos;
- if (len1 <= 0) {
- return 1;
- }
+ return 1;
}
return 1;
@@ -687,38 +756,38 @@ int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder)
if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
double timebase =
- av_q2d(((lp_ac_data)pDecoder->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base);
+ av_q2d(((lp_ac_data)pDecoder->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base);
- //Create a valid timecode
- if (((lp_ac_package_data)pPackage)->pts > 0) {
- lp_ac_decoder_data dec_dat = (lp_ac_decoder_data)pDecoder;
+ //Create a valid timecode
+ if (((lp_ac_package_data)pPackage)->pts > 0) {
+ lp_ac_decoder_data dec_dat = (lp_ac_decoder_data)pDecoder;
- dec_dat->last_timecode = pDecoder->timecode;
- pDecoder->timecode = ((lp_ac_package_data)pPackage)->pts * timebase;
-
- double delta = pDecoder->timecode - dec_dat->last_timecode;
- double max_delta, min_delta;
-
- if (dec_dat->sought > 0) {
- max_delta = 120.0;
- min_delta = -120.0;
- --dec_dat->sought;
- } else {
- max_delta = 4.0;
- min_delta = 0.0;
- }
-
- if ((delta < min_delta) || (delta > max_delta)) {
- pDecoder->timecode = dec_dat->last_timecode;
- if (dec_dat->sought > 0) {
- ++dec_dat->sought;
- }
- }
- }
+ dec_dat->last_timecode = pDecoder->timecode;
+ pDecoder->timecode = ((lp_ac_package_data)pPackage)->pts * timebase;
+
+ double delta = pDecoder->timecode - dec_dat->last_timecode;
+ double max_delta, min_delta;
+
+ if (dec_dat->sought > 0) {
+ max_delta = 120.0;
+ min_delta = -120.0;
+ --dec_dat->sought;
+ } else {
+ max_delta = 4.0;
+ min_delta = 0.0;
+ }
+
+ if ((delta < min_delta) || (delta > max_delta)) {
+ pDecoder->timecode = dec_dat->last_timecode;
+ if (dec_dat->sought > 0) {
+ ++dec_dat->sought;
+ }
+ }
+ }
return ac_decode_audio_package(pPackage, (lp_ac_audio_decoder)pDecoder);
} else if (pDecoder->type == AC_DECODER_TYPE_VIDEO) {
return ac_decode_video_package(pPackage, (lp_ac_video_decoder)pDecoder, pDecoder);
- }
+ }
return 0;
}
@@ -780,4 +849,4 @@ void CALL_CONVT ac_free_decoder(lp_ac_decoder pDecoder) {
else if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
ac_free_audio_decoder((lp_ac_audio_decoder)pDecoder);
}
-}
+} \ No newline at end of file
diff --git a/Game/Code/lib/acinerella/acinerella.h b/Game/Code/lib/acinerella/acinerella.h
index 778d0be1..0fafc011 100644
--- a/Game/Code/lib/acinerella/acinerella.h
+++ b/Game/Code/lib/acinerella/acinerella.h
@@ -158,7 +158,7 @@ struct _ac_decoder {
double timecode;
double video_clock;
-
+
/*Contains information about the stream the decoder is attached to.*/
ac_stream_info stream_info;
/*The index of the stream the decoder is attached to.*/
@@ -176,12 +176,6 @@ typedef ac_decoder* lp_ac_decoder;
/*Contains information about an Acinerella package.*/
struct _ac_package {
- /*The data of the package. This data may not be accessible in other programming languages, because
- currently FFMpeg doesn't reserve this memory area using the Acinerella
- memory manager.*/
- char *data;
- /*The size of the package data.*/
- int size;
/*The stream the package belongs to.*/
int stream_index;
};
diff --git a/Game/Code/lib/acinerella/acinerella.pas b/Game/Code/lib/acinerella/acinerella.pas
index 678a1ae3..06d8db41 100644
--- a/Game/Code/lib/acinerella/acinerella.pas
+++ b/Game/Code/lib/acinerella/acinerella.pas
@@ -157,8 +157,8 @@ type
{The timecode of the currently decoded picture in seconds.}
timecode: double;
-
- video_clock: double;
+
+ video_clock: double;
{Contains information about the stream the decoder is attached to.}
stream_info: TAc_stream_info;
@@ -175,12 +175,6 @@ type
{Contains information about an Acinerella package.}
TAc_package = record
- {The data of the package. This data may not be accessible, because
- currently FFMpeg doesn't reserve this memory area using the Acinerella
- memory manager.}
- data: PByte;
- {The size of the package data.}
- size: integer;
{The stream the package belongs to.}
stream_index: integer;
end;
diff --git a/Game/Output/Changelog.german.txt b/Game/Output/Changelog.german.txt
index 032fc69e..795c1ffd 100644
--- a/Game/Output/Changelog.german.txt
+++ b/Game/Output/Changelog.german.txt
@@ -1,3 +1,31 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r7c vom 01.05.2010
+-----------------------------
+Fix: (Videos) Einige Probleme im Zusammenhang mit wmv-Videos beseitigt.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7b vom 29.04.2010
+-----------------------------
+Add: (Allgemein) Niederländische übersetzung hinzugefügt (thx to Bruut)
+Add: (Theme) Blue Sensation als Standard-Theme.
+Add: (Themes) Fehlende Dateien für Theme iStar hinzugefügt.
+New: (Allgemein) Bei Spielstart werden im Ladebild die Anzahl der aktuell gefundenen Songs aufgelistet.
+New: (Allgemein) Shuffle Modus: Wenn man in der Songauswahl nichts macht, so wird nach einer voreingestellten Zeit zu einem zufällig ausgewählten Lied gesprungen. Einstellen kann man Off, 15s, 30s, ..., 120s und MAX. Bei MAX wird das Lied immer erst zu Ende gespielt.
+New: (Allgemein) Sortierung und Ordnerstruktur wird ohne Neustart übernommen.
+New: (Party) Mit STRG+*(Numlock) oder STRG+R werden die Namen bei der Namenseingabe durcheinandergewürfelt (von merc).
+New: (Party) Wenn man "NewPartyPoints" auf On in der INI setzt, so bekommt das Siegerteam 2 Punkte, das zweite Team einen Punkt wenn man mit drei Teams spielt (von merc).
+New: (Videos) Dynamische, abschaltbare Video-FPS Anpassung (bei langsamen Grafikkarten wie Intels GMA im zusammenhang mit HD-Videos). Abzustellen mit "PerformanceMode=Off".
+Fix: (Allgemein) Kein Absturz mehr unter Vista/Win7 wenn man das Spiel ohne Mic startet.
+Fix: (Allgemein) LoadFaultySongs=On wurde nach einem Neustart mit Off überschrieben
+Fix: (Allgemein) Verbessertes Fading und Videodarstellung bei benutzung von zwei Bildschirmen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7a vom 06.03.2010
+-----------------------------
+Add: (Editor) Negativer VideoGap wird unterstützt.
+Add: (Themes) Blue Sensation und iStar Themes hinzugefügt (thx to gpm).
+Upd: (Allgemein) Freestyle-Noten der Länge Null werden nicht mehr als Fehler eingestuft.
+Upd: (Editor) Theme nun zu 100% fest einprogrammiert. Ist dadurch kompatibler mit den anderen Themes.
+Upd: (Videos) Videosuchlauf in SingScreen nun genau so, wie in VideoPreview. Nicht schön aber schneller.
+Fix: (Party) Übersprungene Lieder wurden fälschlicherweise in der nächsten Runde nicht mehr angezeigt.
+
Ultrastar Deluxe v1.0.1a Challenge MOD r7 vom 04.03.2010
-----------------------------
New: (Allgemein) Experimentelle Karaoke-Funktion (Singstimme ausblenden, bitte nicht zu ernst nehmen): mit K ein/ausschalten
diff --git a/Game/Output/Changelog.txt b/Game/Output/Changelog.txt
index 7257c952..2714cbce 100644
--- a/Game/Output/Changelog.txt
+++ b/Game/Output/Changelog.txt
@@ -1,3 +1,31 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r7c (01.05.2010)
+-----------------------------
+Fix: (Videos) Fixed some problems with wmv-videos.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7b (29.04.2010)
+-----------------------------
+Add: (General) Added dutch translation (thx to Bruut).
+Add: (Theme) Blue Sensation is now the default theme.
+Add: (Themes) Added missing files for iStar theme.
+New: (General) The loading screen shows a song-counter.
+New: (General) You can turn on ShuffleMode in game options: The game shuffles songs if you idle in song screen.
+New: (General) You can change the sorting and tabs on/off without the need of restarting.
+New: (Party) Press Left-Ctrl + * (* on Numpad) or CTRL+R to Shuffle Player Names in Classic Party Mode "Team- and Player Names"-Screen (by merc).
+New: (Party) Set "NewPartyPoints" in config.ini to "On" to give Winner Team 2Points and 2nd placed Team 1Point while playing with 3 Teams (by merc).
+New: (Videos) Dynamic video-fps adaption: For slow graphic chips like intel GMA. You can turn it off by "PerformanceMode=Off"
+Fix: (General) Vista/Win7 does not crash any more if you dont have a mic.
+Fix: (General) LoadFaultySongs=On has been overwritten with "Off" after a restart.
+Fix: (General) Better fading and video drawing when using two screens.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r7a (06.03.2010)
+-----------------------------
+Add: (Editor) Support for negative video gap.
+Add: (Themes) Added Blue Sensation and iStar Themes (thx to gpm).
+Upd: (General) Freestyle-Notes with zero length are no longer marked as a fault.
+Upd: (Editor) The editor theme is now 100% hardcoded. Its for compatibility with the other themes.
+Upd: (Videos) Faster seeking of video preview position.
+Fix: (Party) Skipped songs were not shown in the next round.
+
Ultrastar Deluxe v1.0.1a Challenge MOD r7 (04.03.2010)
-----------------------------
New: (General) Experimental karaoke function (tries to hide the singing voice, please don't take it too seriously): enable/disable with "K"
diff --git a/Game/Output/Languages/Dutch.ini b/Game/Output/Languages/Dutch.ini
new file mode 100644
index 00000000..08f1862f
--- /dev/null
+++ b/Game/Output/Languages/Dutch.ini
@@ -0,0 +1,415 @@
+[Text]
+SING_LOADING=Laden...
+
+SING_CHOOSE_MODE=Kies modus
+SING_SING=Zingen
+SING_SING_DESC=Snel spelen: zing een solo of een duet
+
+SING_MULTI=Party
+SING_MULTI_DESC=Zing in party-modus
+
+SING_TOOLS=Extra
+
+SING_STATS=Statistieken
+SING_STATS_DESC=Bekijk de statistieken
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Creeër je eigen nummers
+
+SING_GAME_OPTIONS=Spel opties
+SING_GAME_OPTIONS_DESC=Verander de spel instellingen
+
+SING_EXIT=Afsluiten
+SING_EXIT_DESC=Spel beëindigen
+
+SING_OPTIONS=Opties
+SING_OPTIONS_DESC=Verander instellingen
+SING_OPTIONS_WHEREAMI=Opties
+
+SING_OPTIONS_GAME=Spel
+SING_OPTIONS_GRAPHICS=Grafisch
+SING_OPTIONS_SOUND=Geluid
+SING_OPTIONS_LYRICS=Teksten
+SING_OPTIONS_THEMES=Thema's
+SING_OPTIONS_RECORD=Opnamen
+SING_OPTIONS_ADVANCED=Geavanceerd
+SING_OPTIONS_EXIT=Terug
+
+SING_OPTIONS_GAME_WHEREAMI=Opties Spel
+SING_OPTIONS_GAME_DESC=Algemene spelinstellingen
+SING_OPTIONS_GAME_PLAYERS=Spelers
+SING_OPTIONS_GAME_DIFFICULTY=Moeilijkheid
+SING_OPTIONS_GAME_LANGUAGE=Taal
+SING_OPTIONS_GAME_TABS=Tabbladen
+SING_OPTIONS_GAME_SORTING=Sorteren
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opties Grafisch
+SING_OPTIONS_GRAPHICS_DESC=Grafische instellingen
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolutie
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Volledig scherm
+SING_OPTIONS_GRAPHICS_DEPTH=Kleurdiepte
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscoop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Regel Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Video formaat
+
+SING_OPTIONS_SOUND_WHEREAMI=Opties geluid
+SING_OPTIONS_SOUND_DESC=Geluidsinstellingen
+SING_OPTIONS_SOUND_MIC_BOOST=Mic versterken
+SING_OPTIONS_SOUND_CLICK_ASSIST=Klik assistent
+SING_OPTIONS_SOUND_BEAT_CLICK=Metronoom
+SING_OPTIONS_SOUND_THRESHOLD=Drempelwaarde
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Twee speler modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Selectie Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Crossfading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opties Teksten
+SING_OPTIONS_LYRICS_DESC=Tekstinstellingen
+SING_OPTIONS_LYRICS_FONT=Lettertype
+SING_OPTIONS_LYRICS_EFFECT=Effect
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisatie
+
+SING_OPTIONS_THEMES_WHEREAMI=Opties Thema's
+SING_OPTIONS_THEMES_DESC=Thema en Skin instellingen
+SING_OPTIONS_THEMES_THEME=Thema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Kleur
+
+SING_OPTIONS_RECORD_WHEREAMI=Opties Opnamen
+SING_OPTIONS_RECORD_DESC=Microfoon instellingen
+SING_OPTIONS_RECORD_CARD=Geluidskaart
+SING_OPTIONS_RECORD_INPUT=Aansluiting
+SING_OPTIONS_RECORD_CHANNELL=Linkerkanaal
+SING_OPTIONS_RECORD_CHANNELR=Rechterkanaal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opties Geavanceerd
+SING_OPTIONS_ADVANCED_DESC=Geavanceerde instellingen
+SING_OPTIONS_ADVANCED_EFFECTSING=Noot effecten
+SING_OPTIONS_ADVANCED_SCREENFADE=Schermovergang
+SING_OPTIONS_ADVANCED_LOADANIMATION=Laad Animaties
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Veiligheidsvragen
+SING_OPTIONS_ADVANCED_LINEBONUS=Regel Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Na Selectie
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Partymenu
+
+SING_LEGEND_SELECT=Selecteer
+SING_LEGEND_NAVIGATE=Navigeer
+SING_LEGEND_CONTINUE=Verder
+SING_LEGEND_ESC=Terug
+
+SING_PLAYER_DESC=Type spelersnaam
+SING_PLAYER_WHEREAMI=Spelernaam
+SING_PLAYER_ENTER_NAME=type de naam
+
+SING_DIFFICULTY_DESC=Selecteer moeilijkheidsgraad
+SING_DIFFICULTY_WHEREAMI=Moeilijkheidsgraad
+SING_DIFFICULTY_CONTINUE=Verder een nummer selecteren
+SING_EASY=Makkelijk
+SING_MEDIUM=Gemiddeld
+SING_HARD=Moeilijk
+
+SING_SONG_SELECTION_DESC=Kies een nummer
+SING_SONG_SELECTION_WHEREAMI=Nummer selecteren
+SING_SONG_SELECTION_GOTO=Ga naar...
+SING_SONG_SELECTION=Nummer Selectie
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Speellijst
+SING_SONGS_IN_CAT=Nummers
+PLAYLIST_CATTEXT=Speellijst: %s
+
+SING_TIME=TIJD
+SING_TOTAL=Totaal
+SING_MODE=Zing een solo
+SING_NOTES=Noten
+SING_GOLDEN_NOTES=Gouden noten
+SING_PHRASE_BONUS=Regel bonus
+
+SING_MENU=Hoofdmenu
+
+SONG_SCORE=Nummer score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Toon Doof
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Beginnende Ster
+SING_SCORE_LEAD_SINGER=Hoofd Zanger
+SING_SCORE_HIT_ARTIST=Hit Artiest
+SING_SCORE_SUPERSTAR=Superster
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=Top 5 Spelers
+SING_TOP_5_CHARTS_WHEREAMI=Top 5
+SING_TOP_5_CHARTS_CONTINUE=Naar de nummer selectie
+
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=super!
+POPUP_GREAT=geweldig!
+POPUP_GOOD=goed!
+POPUP_NOTBAD=niet slecht!
+POPUP_BAD=slecht!
+POPUP_POOR=beroerd!
+POPUP_AWFUL=verschrikking!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= en
+
+SONG_MENU_NAME_MAIN=Nummer menu
+SONG_MENU_PLAY=Zing
+SONG_MENU_CHANGEPLAYERS=Verander spelers
+SONG_MENU_EDIT=Bewerken
+SONG_MENU_MODI=Zing modus
+SONG_MENU_CANCEL=Afbreken
+
+SONG_MENU_NAME_PLAYLIST=Nummer Menu
+SONG_MENU_PLAYLIST_ADD=Nummer toevoegen
+SONG_MENU_PLAYLIST_DEL=Nummer verwijderen
+
+SONG_MENU_NAME_PLAYLIST_ADD=Nummer toevoegen
+SONG_MENU_PLAYLIST_ADD_NEW=Nieuwe speellijst
+SONG_MENU_PLAYLIST_ADD_EXISTING=Afsluiten speellijst
+SONG_MENU_PLAYLIST_NOEXISTING=Geen speellijst aanwezig
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nieuwe speellijst
+SONG_MENU_PLAYLIST_NEW_CREATE=Creeër
+SONG_MENU_PLAYLIST_NEW_UNNAMED=geennaam
+
+SONG_MENU_NAME_PLAYLIST_DEL=Werkelijk verwijderen?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nee
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Speellijst openen
+SONG_MENU_PLAYLIST_LOAD=Openen
+SONG_MENU_PLAYLIST_DELCURRENT=Verwijder huidige speellijst
+
+SONG_MENU_NAME_PLAYLIST_DEL=Verwijder speellijst?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Gebruik joker
+
+SONG_JUMPTO_DESC=Zoek nummer
+SONG_JUMPTO_TYPE_DESC=Zoek naar:
+SONG_JUMPTO_TYPE1=Alles
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artiest
+SONG_JUMPTO_SONGSFOUND=%d Nummer(s) gevonden
+SONG_JUMPTO_NOSONGSFOUND=Geen nummers gevonden
+SONG_JUMPTO_HELP=Type tekst om te zoeken naar
+SONG_JUMPTO_CATTEXT=Zoek naar: %s
+
+PARTY_MODE=Party modus
+PARTY_DIFFICULTY=Moeilijkheidsgraad
+PARTY_PLAYLIST=Speellijst modus
+PARTY_PLAYLIST_ALL=Alle nummers
+PARTY_PLAYLIST_CATEGORY=Map
+PARTY_PLAYLIST_PLAYLIST=Speellijst
+PARTY_ROUNDS=Rondes
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spelers Team1
+PARTY_TEAMS_PLAYER2=Spelers Team2
+PARTY_TEAMS_PLAYER3=Spelers Team3
+
+PARTY_LEGEND_CONTINUE=Verder
+
+PARTY_OPTIONS_DESC=Instellingen voor de party-spellen
+PARTY_OPTIONS_WHEREAMI=Party Opties
+
+PARTY_PLAYER_DESC=Type speler- en teamnamen!
+PARTY_PLAYER_WHEREAMI=Party Namen
+PARTY_PLAYER_ENTER_NAME=Type namen
+PARTY_PLAYER_LEGEND_CONTINUE=Start Party spel
+
+PARTY_ROUND_DESC=Volgende spelers naar de microfoons
+PARTY_ROUND_WHEREAMI=Party Volgende Ronde
+PARTY_ROUND_LEGEND_CONTINUE=Start ronde
+
+PARTY_SONG_WHEREAMI=Party nummer selectie
+PARTY_SONG_LEGEND_CONTINUE=Zing
+PARTY_SONG_MENU=Party menu
+
+PARTY_SCORE_DESC=scores van de laatste ronde
+PARTY_SCORE_WHEREAMI=Party Punten
+
+PARTY_WIN_DESC=winnaar van het party spel
+PARTY_WIN_WHEREAMI=Party Winnaar
+PARTY_WIN_LEGEND_CONTINUE=Terug naar het hoofdmenu
+
+PARTY_ROUND=Ronde
+PARTY_ROUND_WINNER=Winnaar
+PARTY_NOTPLAYEDYET=nog niet gespeeld
+PARTY_NOBODY=niemand
+NEXT_ROUND=Volgende ronde:
+
+PARTY_DISMISSED=Verworpen!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=gewonnen!
+
+PLUGIN_HDL_NAME=Houd de Regel
+PLUGIN_HDL_DESC=Zing niet slechter dan de wijzer in de zing-o-meter aangeeft
+
+PLUGIN_UNTIL5000_NAME=Tot 5000
+PLUGIN_UNTIL5000_DESC=Wie het eerst 5000 punten heeft wint het spel.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Zing een duel tot 10000 punten.
+
+PLUGIN_BLIND_NAME=Blinde Modus
+PLUGIN_BLIND_DESC=Duel zonder de dat je de noten ziet.
+
+STAT_MAIN=Statistieken
+STAT_MAIN_DESC=Algemeen
+STAT_MAIN_WHEREAMI=Statistieken
+
+STAT_OVERVIEW_INTRO=%0:s Statistieken. \n Laaste herstart was op %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d nummers(%3:d met Video), waarvan %1:d al zijn gespeeld en %2:d nog niet gespeeld.\n Het meest populaire nummer is %5:s van %4:s.
+STAT_OVERVIEW_PLAYER=Sinds de laatste herstart zijn er %0:d verschillende speler(s).\n De beste speler is %1:s met een gemiddelde score van %2:d punten.\n %3:s Heeft de hoogste Score behaald met %4:d punten.
+
+STAT_DETAIL=Statistieken
+STAT_DETAIL_WHEREAMI=Gedetaileerde statistieken
+
+STAT_NEXT=Volgende pagina
+STAT_PREV=Vorige pagina
+STAT_REVERSE=Anders om
+STAT_PAGE=Pagina %0:d van %1:d Pagina's\n (%2:d van %3:d records)
+
+STAT_DESC_SCORES=Hoogste scores
+STAT_DESC_SCORES_REVERSED=Laagste scores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste Zangers
+STAT_DESC_SINGERS_REVERSED=Slechtste Zangers
+STAT_FORMAT_SINGERS=%0:s \n Gemiddelde score: %1:d
+
+STAT_DESC_SONGS=Populairste nummer
+STAT_DESC_SONGS_REVERSED=Minst populaire nummer
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx gezongen
+
+STAT_DESC_BANDS=Populairste artiest
+STAT_DESC_BANDS_REVERSED=Minst populaire artiest
+STAT_FORMAT_BANDS=%0:s \n %1:dx gezongen
+
+MSG_ERROR_TITLE=FOUT!
+MSG_QUESTION_TITLE=Vraag
+MSG_QUIT_USDX=Ultrastar afsluiten?
+MSG_END_PARTY=Party modus afsluiten?
+ERROR_NO_SONGS=Geen nummers geladen
+ERROR_NO_PLUGINS=Geen plugins geladen
+ERROR_CORRUPT_SONG=Nummer kan niet worden geladen.
+
+
+#########################################################
+# NEW/CHANGED TEXTS for M2-MOD #
+#########################################################
+
+#### ScreenOptionsGraphic ####
+;new:
+SING_OPTIONS_GRAPHICS_MOVIE_PREVIEW=Video Voorbeeld
+
+#### ScreenMain ####
+;new:
+SING_PARTY=Party
+;delete old ones!
+SING_MULTI=Klassiek
+SING_MULTI_DESC=Zing in de klassieke party-modus
+
+;new:
+SING_MULTI_M2=Uitdaging
+SING_MULTI_M2_DESC=Zing in de uitdaging-modus
+
+#### ScreenPartyOptionsM2 ####
+;new:
+PARTY_MODE_M2=Party Uitdaging-Modus
+PARTY_OPTIONS_M2_DESC=Kies Uitdagings Opties
+PARTY_OPTIONS_M2_WHEREAMI=Uitdagings Opties
+PARTY_TEAMS_PLAYER_M2=Spelers
+PARTY_OPTIONS_M2_SELECT_PLUGIN=Speel met Plugins
+PARTY_OPTIONS_M2_SELECT_HANDICAP=Speel met Handicaps
+
+#### ScreenPartyPlayerM2 ####
+;new:
+PARTY_PLAYERM2_DESC=Voer namen in
+PARTY_PLAYERM2_WHEREAMI=Uitdaging Namen
+
+#### ScreenPartyNewRoundM2 ####
+;new:
+PARTY_ROUNDM2_DESC=Uitdaging Overzicht
+PARTY_ROUNDM2_WHEREAMI=Uitdaging Volgende Ronde
+PARTY_ROUNDM2_LEGEND_CONTINUE=Ga verder
+PARTY_ROUNDM2=Ronde
+PARTY_ROUNDM2_RESULT=Resultaat
+PARTY_ROUNDM2_NUMBER=
+PARTY_ROUNDM2_NAME=Naam
+PARTY_ROUNDM2_WINS=W
+PARTY_ROUNDM2_DRAFTS=G
+PARTY_ROUNDM2_DEFEATS=V
+PARTY_ROUNDM2_SCORE_DIFF=P-Versch
+PARTY_ROUNDM2_POINTS=P
+PARTY_ROUNDM2_LEGEND_SCROLL=Scroll
+PARTY_ROUNDM2_END=Einde
+
+#### SreenSong in M2 mode ####
+;new:
+PARTY_SONG_WHEREAMI_M2=Uitdaging Nummerselectie
+
+#### ScreenTop ####
+;delete old ones!
+SING_TOP_CHARTS=Top 8 Spelers
+SING_TOP_CHARTS_WHEREAMI=Top 8
+SING_TOP_CHARTS_CONTINUE=Naar Nummerselectie
+
+#### Stats ####
+;new:
+STAT_FORMAT_DATE=%1:.2d.%0:.2d.%2:d
+;delete old ones!
+STAT_DESC_SCORES=Hoogste Scores
+STAT_DESC_SCORES_REVERSED=Laagste Scores
+STAT_FORMAT_SCORES=%0:s - %1:d (on %5:s) [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste Zangers
+STAT_DESC_SINGERS_REVERSED=Slechtste Zangers
+STAT_FORMAT_SINGERS=%0:s \n Gemiddelde Score: %1:d (%2:d Keer Gezongen)
+
+#### Plugins ####
+;new:
+PLUGIN_NOSCORE_NAME=Geen Score
+PLUGIN_NOSCORE_DESC=Duel zonder dat de scores zichtbaar zijn.
+
+PLUGIN_MORE500_NAME=Meer dan 500
+PLUGIN_MORE500_DESC=Loop meer dan 500 punten voor.
+
+PLUGIN_MORE1000_NAME=Meer dan 1000
+PLUGIN_MORE1000_DESC=Loop meer dan 1000 punten voor.
+
+#### ScreenSing ####
+;new
+VIDEO_ASPECT_STRETCH=Uitrekken
+VIDEO_ASPECT_CROP=Inkrimpen
+VIDEO_ASPECT_LETTER_BOX=Letter Box
+
+#### ScreenScore ####
+;new
+SCORE_LEGEND_SCROLL=Scroll
+
+#### ScreenEditSub ####
+;new
+INFO_FILE_SAVED=Bestand Opgeslagen
+ERROR_SAVE_FILE_FAILED=Fout bij opslaan bestand
+
+#### HelpPopup ####
+;new
+MSG_HELP_TITLE=Help-Systeem
+MSG_HELP_KEYMAP=Sneltoetsen
+
+#### AdvancedOptions ####
+;new
+SING_OPTIONS_ADVANCED_SUMPLAYERS=Laat Top 8 zien
+
+#### Options ####
+;new
+ERROR_NO_SOUND_INPUT=No sound input devices found!
+
+#### OptionsGame ####
+;new
+SING_OPTIONS_GAME_SHUFFLETIME=Shuffle mode \ No newline at end of file
diff --git a/Game/Output/acinerella.dll b/Game/Output/acinerella.dll
index 3e8b0bc9..077ff08f 100644
--- a/Game/Output/acinerella.dll
+++ b/Game/Output/acinerella.dll
Binary files differ