Best Video Games in 200X

by Cygon 2. July 2009 19:32

This is my personal list of must-play games in the post-2000 era. I find that often, my opinions differ greatly from the reviews in gaming magazines. For example, I liked DooM 3 because of its story, which I find immersive and fascinating, whereas most people regard the game as a tech demo for id's engine. And I totally don't get Call of Duty 4/5, the story (?) was uninteresting and has you incoherently jumping from place to place with scripted annoyance everywhere that prevents you from playing in your own style :)

If you're equally weird, maybe you can find one or the other insider's tip inbetween this list to check out :D

  • Before Battlezone (also notable: Battlezone 2, Drakan: Order of the Flame, Descent: Freespace: The Great War and Descent: Freespace 2)
  • 2000 Sacrifice (also notable: Shogun: Total War)
  • 2001 Gothic
  • 2002 Gothic II
  • 2003 Prince of Persia: Sands of Time (also notable: Star Wars: Knights of the Old Republic, Unreal II: The Awakening, Beyond Good and Evil)
  • 2004 Prince of Persia: Warrior Within (also notable: DooM 3)
  • 2005 Fahrenheit (also notable: Prince of Persia: The Two Thrones, FlatOut, Quake 4)
  • 2006 Elder Scrolls: Oblivion (also notable: Gothic III)
  • 2007 The Witcher (also notable: Supreme Commander, FlatOut: Ultimate Carnage, Overlord)
  • 2008 Dead Space (also notable: Race Driver: GRID, Space Siege)
  • 2009 Overlord 2 (maybe, the year isn't over yet!)

Sacrifice

Sacrifice is a first person strategy title that plays like no other. There is no overhead map, instead, you're commanding everything from the perspective of your avatar. Most of the time, you would push forward together with your main army. The thing was, while you could leave some soldiers to guard critical locations, but when they're attacked, your coldn't tell them what to do, you had to run, with your army in tow, back to thwart the enemy attack. So the challenge of the game was to start by doing hit-and-run attacks on enemy posts, avoiding the main enemy army and in the end conquering the map without allowing the enemy to get around you.

Gothic I & II

The two first titles from the Gothic series were the most immersive role playing games I've ever played. And I still regularly take them out of their box to replay them. From the beginning, you're dropped into one big, continuous world without zones. The story is interesting and unfolds around you. And the game has the intensity of a sword-fighting first person shooter. The world was especially great because, just like in reality, each location was distinctly different, so whereas in other games with large worlds, you feel lost, in Gothic, you want to explore and remember your path.

Prince of Persia

Prince of Persia: Sands of Time was a novel concept. It's hard to describe, because, if I tell you that you're running and climbing around in a desert castle in sort of a 3D jump and run, that won't do it justice. It's got a brilliant story, a good battle system, fantastic stunts and a likeable character. Each riddle of the game astonishes you a bit more in its design, the unusual steps you have to take to cross it. When you made a mistake - and fell to your certain death - you could rewind time and resume the action where you wanted. New rewind-uses could be earned from killed enemies, which was done using a very nice fighting system.

 

Tags:

Games

String.IndexNotOfAny() for .NET

by Cygon 1. July 2009 18:56

It's been several years since I switched from C++ to C#. But one of the things I'm missing whenever I do complex string operations are libc++'s std::string::find_first_not_of() and std::string::find_last_not_of() methods.

These methods finds the first (or last) character in a string which is /not/ part of the search mask. So...

string::size_type pos = string("hello world").find_first_not_of("hel");

...would return 4 because the fourth character in the string (an 'o') is the first character that is not part of the search mask.

Here's my fix for the situation:

string test = "12345abcde";

int index = test.IndexNotOfAny(new char[] { '1', '2', '3', '4', '5' });
Debug.Assert(index == 5);

I chose the method names (IndexNotOfAny() and LastIndexNotOfAny()) to match the existing methods of the .NET string class (IndexOfAny() and LastIndexOfAny()). Of course, these methods need to do multiple scans over the search mask, so they will be a bit slower than their positive counterparts, just like in C++.

As always, everything is backed by unit tests and you get 100% test coverage!

Download

You can download the most recent version at the time of this writing here:

Nuclex.String.Demo.7z (3,97 kb)

Tags:

Programming

New Blog

by Cygon 30. June 2009 19:00

Alright, my blog is back!

I was forced to take the old one down because it had been destroyed by a spam bot.

The story is this: I was a bit negligent in updating my copy of WordPress, so after several months of blissfully ignorant peace, a spam bot exploited a security issue in the old WordPress version and littered my articles with dozens of pages of hyperlinks to a link farm.

Of course, the bot had been programmed by a moron and destroyed most of my articles by cutting them off in the middle when inserting its crap. And as if that wasn't frustrating enough, it also corrupted the database structure, causing weird stuff to happen.

Apparently, it's no longer enough for those lowlifes to pester website owners with forged referer links, fraudulent advertising offers and fake comments, causing them endless amounts of work. Indeed, why go through the hazzle of deceiving the website owner if you can seize his work right away and abuse it to your heart's content?

You are sure to get some hits to your craptaculous link farms, at least until you have completely ruined the site's ranking. You not only force people to advertise your crap, discredit their name and destroy all their work, you even have them pay your website upkeep, all for the honor of being raped by you. How funny is that?

I went through my backups, but all of them contained the spam as well, so I had no choice but to take the blog down.

Now I had planned to break my bonds with PHP for some time. Not that PHP is neccessarily bad, but most PHP developers are hardly capable of writing hello world without using global variables and opening up security issues, so most PHP software is in a sad state (notable exceptions like Menalto Gallery, the Symfony Framework and PEAR excluded, of course).

And so it happens that the page you're viewing just now is being served to you by BlogEngine.NET, an ASP.NET web application written in C#.

I'll try to re-add some of my old articles to this blog over the next few days if I they're undamaged and/or I can find them on archive.org, otherwise, welcome to a whole new blog :)

Tags:

Web

Cron-like Scheduler for C#

by Cygon 8. June 2009 22:54

For a small utility I was writing for myself, I needed a way to schedule tasks to be executed at regular intervals. Something like Unix' Cron, which executes scripts and programs a predefined times, only faster and written in portable .NET code.

The logical choice would have been to just hook up the System.Threading.Timer class, but being the perfectionist I am, I had to reimplement the whole thing in C# with some extras. For once, I wanted it to be able to use DateTime values for notification. Another problem is that while System.Threading.Timer uses some native code magic to efficiently achieve its goal, it doesn't mix particularly well with unit tests. You don't want your unit tests wait for 5 seconds hoping that the System.Threading.Timer will tick at the expected time - write 100 tests of that kind and your tests will take nearly 10 minutes to run.

So I created a Cron-like scheduler which could use different time sources:

  • A generic time source that works on Windows, Linux and the XBox 360.
  • A windows-specific time source that makes use of Microsoft's SystemEvents class
  • A mocked time source that allows your tests to advance time manually

To keep the entire codebase as efficient as possible, I used a priority queue that sorts the scheduled callbacks by their due time. That way, I can simply let the Scheduler thread sleep until the due time is reached or it needs to be waken up for maintenance.

Example

This what the API looks like now:

// Create a new scheduler (automatically selects best time source)
using(Scheduler scheduler = new Scheduler()) {

  // Schedule a notification in 3 seconds from now
  scheduler.NotifyAt(
    DateTime.UtcNow + TimeSpan.FromSeconds(3),
    delegate(object state) {
      Console.WriteLine("3 seconds have passed!");
    }
  );
  
  
  // Wait 5 seconds. The scheduler will invoke the code in the anonymous
  // delegate using a ThreadPool thread during this time.
  Thread.Sleep(TimeSpan.FromSeconds(5));

} // Scheduler lifetime ends here

 

Now I can test my code without having either ridiculously slow tests or adjusting the timings to values in the millisecond range which might cause random failures if the system load spikes whilst the unit test is running.

Features

  • Scheduling of callbacks with due times ranging from milliseconds to years
  • Configurable time sources, can use real-time, mocked time (for unit tests) or any custom time source you implement
  • 100% test coverage for the whole code base
  • Callbacks can be dependent on the system clock (so you can create callbacks that run exactly at 12 o'clock - even if the user adjusts the system's date/time)
  • Callbacks can have a relative due time (so you can create callbacks that will run in exactly 5 minutes - even if the user changes the system's date/time)
  • Works on Windows, Linux and the XBox 360
  • Cancelling of scheduled callbacks

Download

Source code at the time of this writing: Nuclex.Scheduler.Demo.7z (13,65 kb)

The scheduler has become part of my Nuclex.Support class library. You can find the most recent version of the code in my subversion repository. Point your subversion client at: https://devel.nuclex.org/framework/svn/Nuclex.Support/trunk

Tags:

Programming

Partial Streams and Chained Streams in C#

by Cygon 22. April 2009 22:18

Here's another set of utility classes I needed for a personal project of mine. One allows you to create wrap a Stream so only a limited area of it can be accessed and the other makes multiple Streams together act like they were a single stream. All with nearly zero overhead!

I've seen some crappy YAGNI wrappers for this purpose already, but most of them weren't thought fully through and didn't follow the System.IO.Stream interface. So here's a set of wrappers with well-defined behavior that fully implement all System.IO.Stream methods!

PartialStream

When working with Streams in .NET, sometimes it is neccessary to provide a callee with only partial access to a Stream. Either for reasons of security or just as an exercise in defensive programming: if the user of your code should not seek to certain points in a stream, it's better to prevent them from doing so in the first place.

After I designed a package file format for my game programming needs, I wanted to expose the contents of a single file to my callers, but not allow them to read beyond the end of the file (and thereby into the next file stored in the package), so I needed to somehow limit them to the part of the package Stream that covered the contents of a requested file.

To make this possible, I created the PartialStream class, a thin wrapper that behaves like a Stream, but that's actually a view to a part of a larger Stream. After deciding what to do when the outer Stream doesn't support seeking and how to best behave on write requests that exceed the end of the Stream, I came up with an implementation that almost perfectly mimics a Stream.

Limitations

You cannot extend the lengh of a PartialStream since it would possibly overwrite any data that follows the window covered by the PartialStream in the outer Stream. Theoretically, this limitation could be lifted if the PartialStream ended at the same byte the outer Stream ends at, but for Streams that don't support seeking it's impossible to determine the end, so extending a PartialStream's length has been disabled for good.

Using the PartialStream class from multiple threads, even if each thread has its own PartialStream, is dangerous if any of the PartialStreams share the same outer Stream. This isn't a problem with the PartialStream class, it's a design shortcoming of the Stream class. Since there aren't any ReadAt() or WriteAt() methods, you have to position the file pointer first and then call Read()/Write(). Without synchronization, the result is two concurrent writes that will run in undefined order after any of the two offsets.

Example

using(MemoryStream memoryStream = new MemoryStream()) {
  memoryStream.SetLength(123);
  PartialStream partialStream = new PartialStream(memoryStream, 23, 100);

  Debug.Assert(partialStream.Position == 0);

  byte[] test = new byte[10];
  int bytesRead = partialStream.Read(test, 0, 10);

  Debug.Assert(bytesRead == 10);
  Debug.Assert(partialStream.Position == 10);

  bytesRead = partialStream.Read(test, 0, 10);

  Debug.Assert(bytesRead == 10);
  Debug.Assert(partialStream.Position == 20);
}

ChainStream

This is the opposite of the PartialStream class. The ChainStream combines multiple separate Streams into a single Stream, allowing you to access them as if they were just one continuous Stream.

If you're working with data that has been split into several files or if you're trying to add a header to data that is already containing in a MemoryStream, you can use this class to avoid time-consuming copies and fuse the Streams on the fly.

Depending in the capabilities of the chained Streams, the ChainStream will support reading, writing and seeking. However, this is an all-or-none decision: If just one Stream doesn't support reading, the ChainStream will block any read attempt, not only if the offset being read falls into the affected Stream.

This decision had to be made to not violate the Stream interface. CanRead, CanSeek and CanWrite are booleans, so you cannot return values like "mostly" or "a bit". A Stream either supports reading everywhere or it doesn't.

Writing works like this: If one or more of the chained Streams don't support seeking, the ChainStream acts like an unseekable Stream -- data is appended to the end of it, meaning the last Stream in the chain. If all chained Streams support seeking, writes will overwrite data contained in the chained Streams and jump to the next Stream in the chain whenever the end of the current Stream is reached. Writing to the end of the ChainStream extends the length of the final Stream in the chain.

Limitations

Just like already explained in the PartialStream limitations, due to a shortcoming in the design of the Stream class, you should not access a single Stream from multiple threads. That includes the scenario where each thread has its own ChainStream, but one of more of the chained streams are shared between the ChainStream instances.

Example

MemoryStream stream1 = new MemoryStream(new byte[10]);
MemoryStream stream2 = new MemoryStream(new byte[10]);

stream1.Write(new byte[] { 1, 2, 3, 4, 5 }, 0, 5);
stream2.Write(new byte[] { 6, 7, 8, 9, 10 }, 0, 5);

ChainStream chainer = new ChainStream(stream1, stream2);

chainer.Position = 3;
byte[] buffer = new byte[15];
int bytesRead = chainer.Read(buffer, 0, 14);

Debug.Assert(bytesRead == 14);

byte[] expected = new byte[] {
  4, 5, 0, 0, 0, 0, 0, 6, 7, 8, 9, 10, 0, 0, 0
};
for(int index = 0; index < expected.Length; ++index) {
  Debug.Assert(buffer[index] == expected[index]);
}

Features

  • Wrapper fully implements the entire System.IO.Stream interface
  • Unit tests with 100% test coverage included
  • Efficiently implemented, almost zero overhead

Download

You can download the code as it is at the time of this writing from here: Nuclex.Streams.Demo.7z (10,46 kb)

The PartialStream and ChainStream classes have become part of my Nuclex.Support library. To download the latest version of the code, point your subversion client at this url:

https://devel.nuclex.org/framework/svn/Nuclex.Support/trunk

Tags:

Programming

DOM-like Command Line Parser in C#

by Cygon 15. April 2009 21:25

Sometimes, you still find yourself writing command line utilities, even in .NET. If you need a small program that can be integrated into any build process, be it MSBuild, NAnt or Make, the command line is the most versatile interface you can design for.

Now there are already various command line parsing libraries for .NET out there, so why add another?

First and foremost, because the parsers I've found all hack together all parts command-line processing into a single big soup of code. If you combined XML parsing, interpretation and response into one tightly-integrated codebase, it would become a big mess. Instead, you've got a separate XML parser, an XML binder and your data structures, all different things. My goal was to at least separate the command line parsing code from the binding code.

Second, the parsers I've found either had no unit tests or were far from achieving 100% test coverage.

Third, nearly all parsers used a bunch of regular expressions that covered most cases you will encounter, but still showed some quirks when malformed or unusual forms of arguments were provided on the command line.

Design Goals

My design goals for the new parser were:

  • The parser should merely provide programmer-friendly access to the command line, without any interpretation or binding code woven into it (basically a command line DOM that can be used to parse and format command line documents)
  • Complicated command lines should be parseable. This includes quoted arguments, initiators in quoted arguments, assignments and modifiers
  • Malformed command lines should be parsed with best effort
  • 100% test coverage for the code
  • It should be easy to implement dedicated binding code and interpreters on top of the parser

Examples

Using the parser to extract parameters from a command line is pretty straightforward

// Parse an example command line
CommandLine cmd = CommandLine.Parse(
  "-test somefile.txt \"this is a test\" --option=\"some value\""
);

// Print out some informations we've parsed
Console.WriteLine("Number of arguments: " + cmd.Arguments.Count);
Console.WriteLine("  Name of argument 1: " + cmd.Arguments[0].Name);
Console.WriteLine("  Value of argument 2: " + cmd.Arguments[1].Value);
Console.WriteLine("  Initiator in argument 4: " + cmd.Arguments[3].Initiator);

It can also be used to construct command lines programmatically

CommandLine cmd = new CommandLine();

cmd.AddValue("hello world");
cmd.AddOption("modifier");
cmd.AddAssignment("foo", "bar");

Console.WriteLine("Formatted command line: " + cmd.ToString());

Download

You can download a snapshot of the code at the time of this writing here: Nuclex.CommandLine.Demo.7z (13,26 kb)

The command line parser is part of my Nuclex.Support library. To grab the most recent version of the sources, point your subversion client at: https://devel.nuclex.org/framework/svn/Nuclex.Support/trunk

Tags:

Programming

CDDB Protocol Client in C#

by Cygon 6. April 2009 21:13

AccurateRip vs. Existing Audio Files

Like any true audiophile, I have ripped my entire CD collection using Exact Audio Copy, AccurateRip and FLAC. Exact Audio Copy is the digital audio ripper of choice because it supports read offset detection. The idea is this: while most drives accurately capture digital data from an audio CD, each drive seems to have a different idea about where exactly audio begins. So even though you've got error-free rips from different drives, they would still not match up byte-by-byte because they begin at slightly different positions on the CD - that is, unless your ripping tool knows about this offset and compensates for it, which is exactly what Exact Audio Copy does.

AccurateRip now makes use of the fact that Exact Audio Copy always produces the exact same file on any drive and stores the checksums of these audio files in a database. That way, whenever I rip an audio CD, I can see whether everyone else had the same checksum for his audio files. If yes, I can rest assured that no read errors occured.

The problem is, you can't easily use AccurateRip after you've ripped your audio CDs to check them again. AccurateRip requires a CD's CDDB ID and in addition to that has its own algorithm to generate a unique ID from the track start offsets. When you rip a CD's tracks individually, some of this information, like the length of the gaps between tracks, is lost (unless you rip your audio CDs into a single file with a CueSheet). So to get the missing information, I came up with a clever plan: query freedb to reconstruct the track offsets, then calculate the checksums from the FLAC files and then query AccurateRip.

To do this, I needed a CDDB client. And because my language of choice is C# and I want to be able to use this stuff on Windows and Linux, I needed a CDDB client written in .NET. None existed so the Nuclex CDDB client was born.

Usage

Because accessing the web can take time, this makes uses of my asynchronous transaction API. Thus, all methods return a Request which you can wait on (using .Join()) or register to be notified when it finishes.

First, you need to connect to a CDDB server. Nuclex.Cddb uses freedb by default:

// Credentials with which we are going to log in to the server
Cddb.Credentials credentials = new Cddb.Credentials(
"johndoe",
"abc.fubar.com",
"testing",
"v0.0PL0"
);

// Log in to a random freedb server
CddbConnection connection = Cddb.Connect(credentials).Join();

 

Next, you should upgrade the protocol level to get UTF-8 support:

connection.ChangeProtocolLevel(newLevel).Join();

 

Then you can query the server for the album of your choice:

// Query the server for all albums which might match our description
Request queryRequest = connection.Query(
totalPlayingTime, trackOffsets
);
Cddb.Disc[] matchingDiscs = queryRequest.Join();

// Read the CDDB database entry of the first returned album
Cddb.DatabaseEntry entry = connection.Read(
matchingDiscs[0].Category, matchingDiscs[0].DiscId
).Join();

// Print out some informations about the album
Console.WriteLine("\tArtist name: " + entry.Artist);
Console.WriteLine("\tAlbum title: " + entry.Album);
Console.WriteLine("\tProduction year: " + entry.Year.ToString());
Console.WriteLine("\tLength: " + entry.DiscLengthSeconds.ToString() + " seconds");

 

Simple, isn't it?

Features

  • Calculates CDDB disc ids from track offset lists
  • Connects to CDDB servers using the CDDB protocol (not HTTP)
  • Support for CDDB protocol levels 1-6 (including UTF-8 text)
  • Lists album categories supported by a CDDB server
  • Queries CDDB servers for any albums matching a list of track offsets
  • Reads and decodes CDDB database entries so they can be processed by code
  • Specific exceptions for each error and capturing of error messages from the server

Download

Here's a capture of the CDDB code at the time of this writing: Nuclex.Cddb.Demo.7z (70,85 kb)

The CDDB code is part of my Nuclex.Audio library. You can obtain the latest version of the library from my subversion repository, however, the code is split between 3 libraries. Point your subversion client at:

  1. https://devel.nuclex.org/framework/svn/audio/Nuclex.Audio/trunk
  2. https://devel.nuclex.org/framework/svn/networking/Nuclex.Networking/trunk
  3. https://devel.nuclex.org/framework/svn/Nuclex.Support/trunk

Tags:

Programming

The Inheritance Cycle

by Cygon 21. October 2008 19:37

(Spoiler free!)

I’ve just read my way through 3 of the finest books I’ve had the chance to enjoy in my life:

I have to admit that I have a certain bias towards fantasy stories set in medieval times and that, especially if dragons are involved, it’s hard for me not to give such books a bonus in my personal rating, but still, I think the books in the inheritance cycle are very well written and provide excellent narration.

Maybe my bias shows here already, but when Eragon appeared on the shelves, many critics moaned endlessly about how it was just a mix of Lord of the Rings and Star Wars. Some plot elements bore a distant likeness to Star Wars and Christopher Paolini used the well-known elv and dwarf stereotypes.

For me, this doesn’t lessen the books in any way. It would become a problem if he actually reused plot elements, because then, I could predict the story and all suspense would be destryoed, but that’s not the case here. Far from it. I think the inheritance cycle tells a genuinely good story.

It’s not without its weaknesses, either. The author sometimes falls trap to the “explainology” that is plaguing mainstream cinema: everything must have a clear and logical reasoning and you better stump the viewer (reader) with his nose into it and then, just to be sure, tell them that they’ve just observed an explanation for the behavior or happening of xy at time z.

The rules of magic in his world also feel like they are becoming a bit of a problem for the author. Magic in Alagaësia seems to be just too powerful. Whereas in other fantasy novels you wonder why the magicians don’t simply telekinetically sever a major artery or smash the brains of the soldiers in an approaching army, in the inheritance cycle, the magicians actually do it.

To counter these attacks, magicians erect wards to protect their own army against such spells. Attacking mages then again will try to find clever and obscure attacks the wards don’t protect against. And if that’s not complicated enough, being a magician is synonymous with also being a telepath, so magicians can battle each other physically, while attempting spells of doom, while using enchanted items and while trying to take control of the enemy magician’s mind.

In short, sometimes, magics seem quite out of control in this story. This earns both a point for a daring and novel idea, but also one for a common weakness in the plot.

Back on the bright side, everything else is solid good work. I am especially happy about how the storytelling doesn’t fell victim to the sightseeing syndrome: while it never stops being interesting, the story doesn’t just jump from spectacle to spectacle with everything inbetween just there to pave the way for another big event.

Granted, you will find this, too, in other books - and if the author is inept, it bcomes real nuisance that’s both boring to the reader and keeps the story from making progress, but I think this is one of the areas Christopher Paolini excels at. Whenever he tells about an unrelated experience by one of the characters, it satisfies something the reader was curious about and he still keeps the tension of the greater story alive.

The consequences of many decisions eragon has to face are as difficult to see for the reader as they appear to the character himself. And eragon doesn’t follow the accepted code of chivalry for modern action heroes. He loses his temper, makes a wrong decision or chooses to create a lesser evil to prevent a larger one. He is neither the typical anti-hero I guess most of us are now fed up seeing depicted again and again in mainstream entertainment nor is he the brilliant knight in shining armor.

The books also don’t shy away from depicting evil in the most real sense: torture, grave unjustice and crimes for which you just want to hit your clenched fist on the table while reading. Who wouldn’t want to punch Galbatorix in the face - again and again - after reading what he really did near the end of Book 3?

Conclusion

So, as you may guess, in my opinion, while the concepts used are not novel, the inheritance cycle is a very well executed and unique story with interesting characters and all the suspense, emotions and beauty I could have wished for.

When I google for reviews, I get the impression that everyone is fond of criticizing the inheritance cycle, but I say this was one of the best reads of my live. I’ve bought the first three books and when book four is published, I shall buy them all again in a matching slipcase.

A book doesn’t define itself by how eloquent it’s written or by how novel the ideas are alone. A book should stoke emotions, entertain and if you will, satisfy some primal urges along the way. That, at least for me, is what makes a good book.

Tags:

Books

FreeImage 3.1.0 x64

by Cygon 27. May 2008 21:06

Yet another one! FreeImage is a popular library among game programmers that can load a wealth of image file formats (.bmp, .dds, .exr, .gif, .ico, .jpg, .mng, .pcx, .png, .tga, .tif). It’s also free and Open Source, so there’s nothing stopping me from attempting an x64 build of it ;)

FreeImage internally uses OpenEXR, the IJG reference JPEG implementation, libmng, libpng, OpenJPEG (supported JPEG 2000) and LibTIFF. All of these libraries are available as source packages as well. I’ve updated all these libraries to their latest available version.

Source Patches

Here are some patches containing the changes I had to apply to FreeImage in order to make it compile to x64 cleanly:

Download: Patch fixing all x64 issues for OpenJPEG 1.3
Download: FreeImage 3.1.0 patch fixing all x64 issues

Visual C++ 2008 Binaries

You can find precompiled, optimized binaries for Visual C++ 2008 in my Subversion repository:

https://devel.nuclex.org/external/svn/freeimage/tags/3.1.0-r1

The binaries have been compiled with Visual C++ 2008, all contained libraries targeting the Multithreaded DLL runtime, so you’ll need the Visual C++ 2008 Runtime [x86, x64] to use them. If you have Visual C++ 2008 installed, you already have the runtime.

Demo Application

If you just want to see whether this truly works, here’s a quick command-line image loader (loads .bmp, .dds, .exr, .gif, .ico, .jpg, .mng, .pcx, .png, .tga, .tif) in both x86 and x64 incarnations. The x64 version only works if you’re running Windows XP x64 or Windows Vista x64, of course:

Download: FreeImage x64 demo application
Requires the Visual C++ 2008 Runtime [x86, x64] to work!

Tags:

Programming

Audiere 1.9.4 x64

by Cygon 26. May 2008 20:06

If you haven’t heard of it before, Audiere is a well designed multi-platform audio library. It incorporates Dumb (for mod playback), FLAC (lossless audio playback), libogg/libvorbis (ogg vorbis playback), Speex (special speech compression) and supports some formats on its own (including .mp3 and .wav of course). And the best part yet: it’s free and open source.

Recently, I’ve been playing around with native x64 applications. My experiences have been very positive so far: Basically any library that provides its source code could be compiled to x64 binaries with very few changes.

Source Patches

Audiere was no different. There was some assembly in FLAC 1.2.1 and libvorbis 1.2.0 that I had to patch, a small WinAPI pointer issue in Audiere and some more minor things. Here are the patches containing my changes:

Download: Patch for libvorbis 1.2.0 fixing all x64 issues
Download: Patch for FLAC 1.2.1 fixing all x64 issues
Download: Audiere 1.9.4 fixes and x64 patch

Visual C++ 2008 Binaries

You can find precompiled, optimized binaries for Visual C++ 2008 in my Subversion repository:

https://devel.nuclex.org/external/svn/audiere/tags/1.9.4-r1

The binaries have been compiled with Visual C++ 2008, all contained libraries targeting the Multithreaded DLL runtime, so you’ll need the Visual C++ 2008 Runtime [x86, x64] to use them. If you have Visual C++ 2008 installed, you already have the runtime.

Demo Application

If you just want to see whether this truly works, here’s a quick command-line audio player (plays .wav, .mp3, .ogg, .flac and .mod) in both x86 and x64 incarnations. The x64 version only works if you’re running Windows XP x64 or Windows Vista x64, of course:

Download: Audiere x64 demo application
Requires the Visual C++ 2008 Runtime [x86, x64] to work!

Enjoy!

Tags:

Music | Programming

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen