<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Helyar.net &#187; csharp</title>
	<atom:link href="http://www.helyar.net/tag/csharp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.helyar.net</link>
	<description>From the desktop of George Helyar</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:11:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Network speed test</title>
		<link>http://www.helyar.net/2009/network-speed-test/</link>
		<comments>http://www.helyar.net/2009/network-speed-test/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 14:56:58 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[network]]></category>

		<guid isPermaLink="false">http://www.helyar.net/?p=309</guid>
		<description><![CDATA[I currently have the need to test the connection speed between two remote machines, so that I know when it is safe to transfer a large file from one to the other without significantly affecting service by causing long periods of downtime. I couldn&#8217;t find any software that did this easily, ran as a single [...]]]></description>
			<content:encoded><![CDATA[<p>I currently have the need to test the connection speed between two remote machines, so that I know when it is safe to transfer a large file from one to the other without significantly affecting service by causing long periods of downtime. I couldn&#8217;t find any software that did this easily, ran as a single executable (no installation) and was free, so I made one.</p>
<p>This currently only tests speed in one direction (upload from the client to the server) because I have symmetric connections on both machines, so either way should be exactly the same, and so that I can just write a client program and use netcat as a server to accept the packets and dump them to /dev/null. It is simple enough to convert this client into a server so that netcat becomes a client or so that they can be used together. Using netcat as a client probably requires quite a large pre-generated random file and may introduce a bottleneck of the hard drive read speed.</p>
<p>This could also be used in the home for something like testing the effect of wifi strength.</p>
<p>The client takes the command line arguments, connects to the server, generates some random data and sends that data repeatedly until the timer expires. It then prints out the results.</p>
<p>The command to use netcat to listen and ignore any data it receives is <code>nc -lp 9000 > /dev/null</code> though the -p isn&#8217;t always needed (it was needed on my Debian box but not my ESX 4 box).</p>
<p>An example of use of this program as a client is:</p>
<pre>C:\>SpeedTestClient.exe 192.168.1.157 9000
Uploaded 1181614080 bytes in 10.015 seconds.
943875.45 kbps (943.88 mbps)
115219.17 kB/s (112.52 MB/s)</pre>
<p>The results are given in kilobits per second and megabits per second (standard measurements for network speed), kilobytes per second and megabytes per second (more useful for knowing how long a file will take to transfer). In this example, a gigabit ethernet connection is getting roughly 944 mbps.</p>
<p>A few seconds later, VLC 1.0 is opened and paused, so nothing is playing and the test is run again. The results are quite interesting:</p>
<pre>Uploaded 225083392 bytes in 10.015 seconds.
179797.02 kbps (179.80 mbps)
 21947.88 kB/s ( 21.43 MB/s)</pre>
<p>It says it is using next to no system resources when paused but it slows data transfer dramatically and this is with 8GiB of RAM, an otherwise idle CPU and no hard drives being used. When hard drives enter the equation this drops down to about 8MB/s (while VLC is still paused &#8211; I have particularly fast hard drives so I still get about 110MB/s when hard drives are used and VLC is turned off).</p>
<p>The code listing is as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.IO</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Net</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Net.Sockets</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Security.Cryptography</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">namespace</span> SpeedTest
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;color: blue;">class</span> SpeedTestClient
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> Main<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> args<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span> <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">2</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                Console<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteLine</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;Usage: SpeedTestClient &lt;ip&gt; &lt;port&gt; [&lt;seconds&gt;]&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;color: blue;">try</span>
            <span style="color: #008000;color: black;">&#123;</span>
                <span style="color: #6666cc; font-weight: bold;color: blue;">ulong</span> bytes <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> startTime <span style="color: #008000;color: black;">=</span> Environment<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">TickCount</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #6666cc; font-weight: bold;color: blue;">bool</span> started <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">false</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> timeout <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">10</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                <span style="color: #008080; font-style: italic;color: green;">// Get the optional number of seconds argument</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span> <span style="color: #008000;color: black;">&gt;</span> <span style="color: #FF0000;color: maroon;">2</span><span style="color: #008000;color: black;">&#41;</span> timeout <span style="color: #008000;color: black;">=</span> <span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Parse</span><span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">&#91;</span><span style="color: #FF0000;color: maroon;">2</span><span style="color: #008000;color: black;">&#93;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                <span style="color: #008080; font-style: italic;color: green;">// Connect to the server via TCP</span>
                TcpClient client <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> TcpClient<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                client<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Connect</span><span style="color: #008000;color: black;">&#40;</span>IPAddress<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Parse</span><span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">&#91;</span><span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">&#93;</span><span style="color: #008000;color: black;">&#41;</span>, <span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Parse</span><span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">&#91;</span><span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#93;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                NetworkStream stream <span style="color: #008000;color: black;">=</span> client<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">GetStream</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                <span style="color: #008080; font-style: italic;color: green;">// Generate some random data. Buffers too small will bottleneck.</span>
                RandomNumberGenerator rng <span style="color: #008000;color: black;">=</span> RandomNumberGenerator<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Create</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #6666cc; font-weight: bold;color: blue;">byte</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> buffer <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> <span style="color: #6666cc; font-weight: bold;color: blue;">byte</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #FF0000;color: maroon;">32768</span><span style="color: #008000;color: black;">&#93;</span><span style="color: #008000;color: black;">;</span>
                rng<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">GetBytes</span><span style="color: #008000;color: black;">&#40;</span>buffer<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                <span style="color: #0600FF; font-weight: bold;color: blue;">while</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">true</span><span style="color: #008000;color: black;">&#41;</span>
                <span style="color: #008000;color: black;">&#123;</span>
                    <span style="color: #008080; font-style: italic;color: green;">// Write the data</span>
                    stream<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Write</span><span style="color: #008000;color: black;">&#40;</span>buffer, <span style="color: #FF0000;color: maroon;">0</span>, buffer<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                    <span style="color: #008080; font-style: italic;color: green;">// Start the timer only after some data has been sent</span>
                    <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">!</span>started<span style="color: #008000;color: black;">&#41;</span>
                    <span style="color: #008000;color: black;">&#123;</span>
                        startTime <span style="color: #008000;color: black;">=</span> Environment<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">TickCount</span><span style="color: #008000;color: black;">;</span>
                        started <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">true</span><span style="color: #008000;color: black;">;</span>
                    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
                    <span style="color: #008080; font-style: italic;color: green;">// Add to the bytes counter</span>
                    bytes <span style="color: #008000;color: black;">+=</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">ulong</span><span style="color: #008000;color: black;">&#41;</span>buffer<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">LongLength</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                    <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>Environment<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">TickCount</span> <span style="color: #008000;color: black;">-</span> startTime <span style="color: #008000;color: black;">&gt;=</span> timeout <span style="color: #008000;color: black;">*</span> <span style="color: #FF0000;color: maroon;">1000</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">break</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
                PrintFinalStats<span style="color: #008000;color: black;">&#40;</span>startTime, Environment<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">TickCount</span>, bytes<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
                <span style="color: #0600FF; font-weight: bold;color: blue;">try</span> <span style="color: #008000;color: black;">&#123;</span> client<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Close</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span> <span style="color: #008000;color: black;">&#125;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">catch</span> <span style="color: #008000;color: black;">&#40;</span>IOException<span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">&#123;</span> <span style="color: #008080; font-style: italic;color: green;">/* Do nothing */</span> <span style="color: #008000;color: black;">&#125;</span>
            <span style="color: #008000;color: black;">&#125;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">catch</span> <span style="color: #008000;color: black;">&#40;</span>Exception ex<span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                Console<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Error</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteLine</span><span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> PrintFinalStats<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span> start, <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> end, <span style="color: #6666cc; font-weight: bold;color: blue;">ulong</span> bytes<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> seconds <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: black;">&#40;</span>end <span style="color: #008000;color: black;">-</span> start<span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1000.0</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">ulong</span> bits <span style="color: #008000;color: black;">=</span> bytes <span style="color: #008000;color: black;">*</span> <span style="color: #FF0000;color: maroon;">8</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> bitsPerSecond <span style="color: #008000;color: black;">=</span> bits <span style="color: #008000;color: black;">/</span> seconds<span style="color: #008000;color: black;">;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> bytesPerSecond <span style="color: #008000;color: black;">=</span> bytes <span style="color: #008000;color: black;">/</span> seconds<span style="color: #008000;color: black;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> kbps <span style="color: #008000;color: black;">=</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Format</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;{0:0.00}&quot;</span>, bitsPerSecond <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1000</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> mbps <span style="color: #008000;color: black;">=</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Format</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;{0:0.00}&quot;</span>, bitsPerSecond <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1000</span> <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1000</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> kibs <span style="color: #008000;color: black;">=</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Format</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;{0:0.00}&quot;</span>, bytesPerSecond <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1024</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> mibs <span style="color: #008000;color: black;">=</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Format</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;{0:0.00}&quot;</span>, bytesPerSecond <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1024</span> <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">1024</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> kPad <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Max</span><span style="color: #008000;color: black;">&#40;</span>kbps<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span>, kibs<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> mPad <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Max</span><span style="color: #008000;color: black;">&#40;</span>mbps<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span>, mibs<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            Console<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteLine</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;Uploaded {0} bytes in {1} seconds.&quot;</span>, bytes, seconds<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            Console<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteLine</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;{0} kbps ({1} mbps)&quot;</span>, kbps<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">PadLeft</span><span style="color: #008000;color: black;">&#40;</span>kPad<span style="color: #008000;color: black;">&#41;</span>, mbps<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">PadLeft</span><span style="color: #008000;color: black;">&#40;</span>mPad<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            Console<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteLine</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;{0} kB/s ({1} MB/s)&quot;</span>, kibs<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">PadLeft</span><span style="color: #008000;color: black;">&#40;</span>kPad<span style="color: #008000;color: black;">&#41;</span>, mibs<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">PadLeft</span><span style="color: #008000;color: black;">&#40;</span>mPad<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></div></div>

<p>A compiled .net executable is available <a href="http://www.helyar.net/files/SpeedTestClient.exe">here</a>.</p>
<p>P.S. always remember to turn off VLC before transferring files over the network.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/network-speed-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>libvlc media player in C# (part 2)</title>
		<link>http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/</link>
		<comments>http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/#comments</comments>
		<pubDate>Fri, 08 May 2009 15:38:56 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[libvlc]]></category>
		<category><![CDATA[vlc]]></category>

		<guid isPermaLink="false">http://www.helyar.net/blog/?p=156</guid>
		<description><![CDATA[I gave some simplified VLC media player code in part 1 to show how easy it was to do and how most wrapper libraries make a mountain out of a mole hill. In that entry, I briefly touched on using some classes to make it easier and safer to implement actual programs with this. The [...]]]></description>
			<content:encoded><![CDATA[<p>I gave some simplified VLC media player code in <a href="http://www.helyar.net/2009/libvlc-media-player-in-c/">part 1</a> to show how easy it was to do and how most wrapper libraries make a mountain out of a mole hill. In that entry, I briefly touched on using some classes to make it easier and safer to implement actual programs with this.</p>
<p>The first thing to do is write a wrapper for the exceptions, so that they are handled nicely in C#. For a program using the library, exceptions should be completely transparent and should be handled in the normal try/catch blocks without having to do anything like initialise them or check them.</p>
<p>Another thing to do is to move all of the initialisation functions into constructors and all of the release functions into destuctors or use the System.IDisposable interface.</p>
<p>Here is the code listing for the 4 classes used (VlcInstance, VlcMedia, VlcMediaPlayer and VlcException). Note that the first 3 of these are very similar and that the main difference is that the media player class has some extra functions for doing things like playing and pausing the content.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #6666cc; font-weight: bold;color: blue;">class</span> VlcInstance <span style="color: #008000;color: black;">:</span> IDisposable
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">internal</span> IntPtr Handle<span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> VlcInstance<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> args<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        Handle <span style="color: #008000;color: black;">=</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_new</span><span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span>, args, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Dispose<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_release</span><span style="color: #008000;color: black;">&#40;</span>Handle<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;color: blue;">class</span> VlcMedia <span style="color: #008000;color: black;">:</span> IDisposable
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">internal</span> IntPtr Handle<span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> VlcMedia<span style="color: #008000;color: black;">&#40;</span>VlcInstance instance, <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> url<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        Handle <span style="color: #008000;color: black;">=</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_new</span><span style="color: #008000;color: black;">&#40;</span>instance<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Handle</span>, url, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Dispose<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_release</span><span style="color: #008000;color: black;">&#40;</span>Handle<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;color: blue;">class</span> VlcMediaPlayer <span style="color: #008000;color: black;">:</span> IDisposable
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">internal</span> IntPtr Handle<span style="color: #008000;color: black;">;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> IntPtr drawable<span style="color: #008000;color: black;">;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">bool</span> playing, paused<span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> VlcMediaPlayer<span style="color: #008000;color: black;">&#40;</span>VlcMedia media<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        Handle <span style="color: #008000;color: black;">=</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_new_from_media</span><span style="color: #008000;color: black;">&#40;</span>media<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Handle</span>, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Dispose<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_release</span><span style="color: #008000;color: black;">&#40;</span>Handle<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> IntPtr Drawable
    <span style="color: #008000;color: black;">&#123;</span>
        get
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> drawable<span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
        set
        <span style="color: #008000;color: black;">&#123;</span>
            VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_set_drawable</span><span style="color: #008000;color: black;">&#40;</span>Handle, value, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
            drawable <span style="color: #008000;color: black;">=</span> value<span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">bool</span> IsPlaying <span style="color: #008000;color: black;">&#123;</span> get <span style="color: #008000;color: black;">&#123;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> playing <span style="color: #008000;color: black;">&amp;&amp;</span> <span style="color: #008000;color: black;">!</span>paused<span style="color: #008000;color: black;">;</span> <span style="color: #008000;color: black;">&#125;</span> <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">bool</span> IsPaused <span style="color: #008000;color: black;">&#123;</span> get <span style="color: #008000;color: black;">&#123;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> playing <span style="color: #008000;color: black;">&amp;&amp;</span> paused<span style="color: #008000;color: black;">;</span> <span style="color: #008000;color: black;">&#125;</span> <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">bool</span> IsStopped <span style="color: #008000;color: black;">&#123;</span> get <span style="color: #008000;color: black;">&#123;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> <span style="color: #008000;color: black;">!</span>playing<span style="color: #008000;color: black;">;</span> <span style="color: #008000;color: black;">&#125;</span> <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Play<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_play</span><span style="color: #008000;color: black;">&#40;</span>Handle, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
&nbsp;
        playing <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">true</span><span style="color: #008000;color: black;">;</span>
        paused <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">false</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Pause<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_pause</span><span style="color: #008000;color: black;">&#40;</span>Handle, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>playing<span style="color: #008000;color: black;">&#41;</span>
            paused <span style="color: #008000;color: black;">^=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">true</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Stop<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        VlcException ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_stop</span><span style="color: #008000;color: black;">&#40;</span>Handle, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Ex</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>ex<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">IsRaised</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> ex<span style="color: #008000;color: black;">;</span>
&nbsp;
        playing <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">false</span><span style="color: #008000;color: black;">;</span>
        paused <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">false</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;color: blue;">class</span> VlcException <span style="color: #008000;color: black;">:</span> Exception
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">internal</span> libvlc_exception_t Ex<span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> VlcException<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">:</span> <span style="color: #0600FF; font-weight: bold;color: blue;">base</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        Ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> libvlc_exception_t<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_init</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> Ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">bool</span> IsRaised <span style="color: #008000;color: black;">&#123;</span> get <span style="color: #008000;color: black;">&#123;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_raised</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> Ex<span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">!=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span> <span style="color: #008000;color: black;">&#125;</span> <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">override</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> Message <span style="color: #008000;color: black;">&#123;</span> get <span style="color: #008000;color: black;">&#123;</span> <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_get_message</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> Ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span> <span style="color: #008000;color: black;">&#125;</span> <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></div></div>

<p>Using these classes is even easier than before, can use proper exception handling (removed for brevity) and cleans up better at the end. In this example, I have added an OpenFileDialog, which is where the file is loaded.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.ComponentModel</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Data</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Windows.Forms</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">namespace</span> MyLibVLC
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">partial</span> <span style="color: #6666cc; font-weight: bold;color: blue;">class</span> Form1 <span style="color: #008000;color: black;">:</span> Form
    <span style="color: #008000;color: black;">&#123;</span>
        VlcInstance instance<span style="color: #008000;color: black;">;</span>
        VlcMediaPlayer player<span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> Form1<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            InitializeComponent<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            openFileDialog1<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">FileName</span> <span style="color: #008000;color: black;">=</span> <span style="color: #666666;color: maroon;">&quot;&quot;</span><span style="color: #008000;color: black;">;</span>
            openFileDialog1<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Filter</span> <span style="color: #008000;color: black;">=</span> <span style="color: #666666;color: maroon;">&quot;MPEG|*.mpg|AVI|*.avi|All|*.*&quot;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> args <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> <span style="color: #008000;color: black;">&#123;</span>
                <span style="color: #666666;color: maroon;">&quot;-I&quot;</span>, <span style="color: #666666;color: maroon;">&quot;dummy&quot;</span>, <span style="color: #666666;color: maroon;">&quot;--ignore-config&quot;</span>,
                <span style="color: #666666;">@&quot;--plugin-path=C:\Program Files (x86)\VideoLAN\VLC\plugins&quot;</span>,
                <span style="color: #666666;color: maroon;">&quot;--vout-filter=deinterlace&quot;</span>, <span style="color: #666666;color: maroon;">&quot;--deinterlace-mode=blend&quot;</span>
            <span style="color: #008000;color: black;">&#125;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            instance <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcInstance<span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            player <span style="color: #008000;color: black;">=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">null</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Form1_FormClosed<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, FormClosedEventArgs e<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">if</span><span style="color: #008000;color: black;">&#40;</span>player <span style="color: #008000;color: black;">!=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">null</span><span style="color: #008000;color: black;">&#41;</span> player<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Dispose</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            instance<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Dispose</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Open_Click<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>openFileDialog1<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">ShowDialog</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">!=</span> DialogResult<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">OK</span><span style="color: #008000;color: black;">&#41;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">return</span><span style="color: #008000;color: black;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008000;color: black;">&#40;</span>VlcMedia media <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcMedia<span style="color: #008000;color: black;">&#40;</span>instance, openFileDialog1<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">FileName</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>player <span style="color: #008000;color: black;">!=</span> <span style="color: #0600FF; font-weight: bold;color: blue;">null</span><span style="color: #008000;color: black;">&#41;</span> player<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Dispose</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                player <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> VlcMediaPlayer<span style="color: #008000;color: black;">&#40;</span>media<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
            player<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Drawable</span> <span style="color: #008000;color: black;">=</span> panel1<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Handle</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Play_Click<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            player<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Play</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Pause_Click<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            player<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Pause</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Stop_Click<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            player<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Stop</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></div></div>

<h3>Update:</h3>
<p>I have just corrected a minor bug (the wrong release function being called on the player handle) and uploaded the full Visual Studio 2005 project. You can <a href="http://www.helyar.net/files/MyLibVLC_101.zip">download the full project here</a> (or see 1.1.2 version below). It comes with the libvlc.dll and libvlccore.dll for VLC 1.0.1 in the bin\x86\Debug directory so if you have a version other than this, just overwrite those files.</p>
<h3>Update for VLC 1.1.2:</h3>
<p>You can now <a href="http://www.helyar.net/files/MyLibVLC_112.zip">download the VLC 1.1.2 compatible version</a>. There were some changes to the way libvlc handles exceptions that needed to be corrected. Other than that, there were a couple of minor function name changes.</p>
<p>Please use these posts as a starting point to use your own code though. These posts are intended to <em>stop</em> people from being reliant on the already existing, large, overcomplicated and quickly outdated libraries. They are <em>not</em> intended to be just another library for people to blindly use without understanding how it works. You can use this to learn how to write your own native interop code on a well designed library then adapt it for your own changes and keep it up to date with whichever version of VLC you want. This also means you never have to use the terrible code on pinvoke.net for other libraries, as you can write your own from the original documentation and it will almost always be better.</p>
<p>Bugfix: <code>VlcException</code> should use <code>Marshal.PtrToStringAnsi</code> not <code>Marshal.PtrToStringAuto</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/feed/</wfw:commentRss>
		<slash:comments>128</slash:comments>
		</item>
		<item>
		<title>libvlc media player in C# (part 1)</title>
		<link>http://www.helyar.net/2009/libvlc-media-player-in-c/</link>
		<comments>http://www.helyar.net/2009/libvlc-media-player-in-c/#comments</comments>
		<pubDate>Wed, 06 May 2009 12:44:03 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[libvlc]]></category>
		<category><![CDATA[vlc]]></category>

		<guid isPermaLink="false">http://www.helyar.net/blog/?p=142</guid>
		<description><![CDATA[There seems to be a massive misconception about using VLC inside an application and many, many large wrapper libraries have been written. These are often harder to use than libvlc itself, buggy or just downright don&#8217;t work (at least not in what will be &#8220;the latest&#8221; version of VLC at the time you want to [...]]]></description>
			<content:encoded><![CDATA[<p>There seems to be a massive misconception about using VLC inside an application and many, many large wrapper libraries have been written. These are often harder to use than libvlc itself, buggy or just downright don&#8217;t work (at least not in what will be &#8220;the latest&#8221; version of VLC at the time you want to write anything).</p>
<p>Using the <a href="http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc.html" target="_blank">libvlc documentation</a> directly and the <a href="http://wiki.videolan.org/LibVLC_Tutorial" target="_blank">libvlc example</a> I wrote a simple wrapper class that performs the basics needed to play, pause and stop media. Because it is libvlc, things like resizing the video, toggling full screen by double clicking the video output or streaming media from a source device or network are handled automatically.</p>
<p>This code was all written and tested with VLC 0.98a but because it is taken from the documentation and example, it should work for all versions 0.9x and later with only minor changes. Because it is so simple, these changes should be easy to make. Most of the time, these changes will just be slight function name changes and no new re-structuring is needed.</p>
<p>The first thing to note is that there is no version of libvlc for Windows x64. All developers should set their CPU type to x86, even if they have a 32bit machine. If you set it to &#8220;Any CPU&#8221; then 64bit users will not be able to load libvlc.dll and will crash out. If you are compiling from the command line, this should look something like <code>csc&nbsp;/platform:x86&nbsp;foobar.cs</code></p>
<p>The second thing to note, which trips up a lot of users, is that you must specify VLC&#8217;s plugin directory. This may make distribution a nightmare, as the plugin directory is a large directory full of DLLs. It may be possible to narrow down these DLLs to just the ones your application actually needs but I don&#8217;t know if videolan have any advice about or licensing for redistribution of these.</p>
<p>libvlc is made up of several modules. For the sake of simplicity in this example, I will use 1 static class to contain every exported C function and split them up visually by module with <code>#region</code>.</p>
<p>The nicest thing about VLC, as far as interop with C# goes, is that all memory management is handled internally by libvlc and functions are provided for doing anything that you would need to do to their members. This means that using an IntPtr is suitable for almost everything. You just need to make sure that you pass the correct IntPtr into each function but another layer of C# encapsulating this would easily be able to make sure of that, as discussed in <a href="http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/">part 2</a>. The only structure that you need to define is an exception, which is very simple. You then simply always pass in references to these structs with <code>ref ex</code>.</p>
<p>The code listing for the wrapper class is as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Runtime.InteropServices</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">namespace</span> MyLibVLC
<span style="color: #008000;color: black;">&#123;</span>
  <span style="color: #008080; font-style: italic;color: green;">// http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc.html</span>
&nbsp;
  <span style="color: #008000;color: black;">&#91;</span>StructLayout<span style="color: #008000;color: black;">&#40;</span>LayoutKind<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Sequential</span>, Pack <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
  <span style="color: #6666cc; font-weight: bold;color: blue;">struct</span> libvlc_exception_t
  <span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> b_raised<span style="color: #008000;color: black;">;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> i_code<span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#91;</span>MarshalAs<span style="color: #008000;color: black;">&#40;</span>UnmanagedType<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">LPStr</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> psz_message<span style="color: #008000;color: black;">;</span>
  <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
  <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #6666cc; font-weight: bold;color: blue;">class</span> LibVlc
  <span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #008080;">#region core</span>
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> IntPtr libvlc_new<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span> argc, <span style="color: #008000;color: black;">&#91;</span>MarshalAs<span style="color: #008000;color: black;">&#40;</span>UnmanagedType<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">LPArray</span>,
      ArraySubType <span style="color: #008000;color: black;">=</span> UnmanagedType<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">LPStr</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> argv, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_release<span style="color: #008000;color: black;">&#40;</span>IntPtr instance<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008080;">#endregion</span>
&nbsp;
    <span style="color: #008080;">#region media</span>
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> IntPtr libvlc_media_new<span style="color: #008000;color: black;">&#40;</span>IntPtr p_instance,
      <span style="color: #008000;color: black;">&#91;</span>MarshalAs<span style="color: #008000;color: black;">&#40;</span>UnmanagedType<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">LPStr</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> psz_mrl, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t p_e<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_media_release<span style="color: #008000;color: black;">&#40;</span>IntPtr p_meta_desc<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008080;">#endregion</span>
&nbsp;
    <span style="color: #008080;">#region media player</span>
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> IntPtr libvlc_media_player_new_from_media<span style="color: #008000;color: black;">&#40;</span>IntPtr media,
      <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_media_player_release<span style="color: #008000;color: black;">&#40;</span>IntPtr player<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_media_player_set_drawable<span style="color: #008000;color: black;">&#40;</span>IntPtr player, IntPtr drawable,
      <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t p_e<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_media_player_play<span style="color: #008000;color: black;">&#40;</span>IntPtr player, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_media_player_pause<span style="color: #008000;color: black;">&#40;</span>IntPtr player, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_media_player_stop<span style="color: #008000;color: black;">&#40;</span>IntPtr player, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008080;">#endregion</span>
&nbsp;
    <span style="color: #008080;">#region exception</span>
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> libvlc_exception_init<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t p_exception<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">int</span> libvlc_exception_raised<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t p_exception<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #008000;color: black;">&#91;</span>DllImport<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;libvlc&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#93;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #0600FF; font-weight: bold;color: blue;">extern</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span> libvlc_exception_get_message<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t p_exception<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008080;">#endregion</span>
  <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></div></div>

<p>For a sample application to use this simple wrapper, I just created a new Windows form and added a play button, stop button and a panel for viewing the video. In this example, the stop button also cleans everything up so you should make sure to press it before closing the form.</p>
<p>At one point during this code, libvlc can optionally be given a HWND to draw to. If you don&#8217;t give it one, it pops up a new player. However, people seem to be confused over how simple this is to do in C# and have been making large amounts of interop calls to the Win32 API to get handles. This is not necessary, as System.Windows.Forms.Control.Handle allows you go get the window handle (HWND) to any component that inherits from the Control class. This includes the Form class and the Panel class (and even the Button class) so all you actually need to pass it is this.Handle (for the handle to the form itself) or panel.Handle (for a Panel called panel). If you want it to start fullscreen, add the command line argument &#8220;-f&#8221; rather than using the Win32 function GetDesktopWindow().</p>
<p>Because I will be using this to display PAL video, which is interlaced at 576i, I have added some deinterlacing options to the command line. These are <code>--vout-filter=deinterlace</code> and <code>--deinterlace-mode=blend</code>.</p>
<p>Without further ado, here is the code listing for the partial windows form class:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.ComponentModel</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Data</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Windows.Forms</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Runtime.InteropServices</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">namespace</span> MyLibVLC
<span style="color: #008000;color: black;">&#123;</span>
  <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">partial</span> <span style="color: #6666cc; font-weight: bold;color: blue;">class</span> Form1 <span style="color: #008000;color: black;">:</span> Form
  <span style="color: #008000;color: black;">&#123;</span>
    IntPtr instance, player<span style="color: #008000;color: black;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> Form1<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
      InitializeComponent<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Play_Click<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
      libvlc_exception_t ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> libvlc_exception_t<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_init</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> args <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> <span style="color: #6666cc; font-weight: bold;color: blue;">string</span><span style="color: #008000;color: black;">&#91;</span><span style="color: #008000;color: black;">&#93;</span> <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #666666;color: maroon;">&quot;-I&quot;</span>, <span style="color: #666666;color: maroon;">&quot;dummy&quot;</span>, <span style="color: #666666;color: maroon;">&quot;--ignore-config&quot;</span>,
        <span style="color: #666666;">@&quot;--plugin-path=C:\Program Files (x86)\VideoLAN\VLC\plugins&quot;</span>,
        <span style="color: #666666;color: maroon;">&quot;--vout-filter=deinterlace&quot;</span>, <span style="color: #666666;color: maroon;">&quot;--deinterlace-mode=blend&quot;</span>
      <span style="color: #008000;color: black;">&#125;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      instance <span style="color: #008000;color: black;">=</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_new</span><span style="color: #008000;color: black;">&#40;</span>args<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Length</span>, args, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      IntPtr media <span style="color: #008000;color: black;">=</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_new</span><span style="color: #008000;color: black;">&#40;</span>instance, <span style="color: #666666;">@&quot;C:\foobar.mpg&quot;</span>, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      player <span style="color: #008000;color: black;">=</span> LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_new_from_media</span><span style="color: #008000;color: black;">&#40;</span>media, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_release</span><span style="color: #008000;color: black;">&#40;</span>media<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      <span style="color: #008080; font-style: italic;color: green;">// panel1 may be any component including a System.Windows.Forms.Form but</span>
      <span style="color: #008080; font-style: italic;color: green;">// this example uses a System.Windows.Forms.Panel</span>
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_set_drawable</span><span style="color: #008000;color: black;">&#40;</span>player, panel1<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Handle</span>, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_play</span><span style="color: #008000;color: black;">&#40;</span>player, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">private</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Stop_Click<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
      libvlc_exception_t ex <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> libvlc_exception_t<span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_init</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_stop</span><span style="color: #008000;color: black;">&#40;</span>player, <span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_media_player_release</span><span style="color: #008000;color: black;">&#40;</span>player<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
      LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_release</span><span style="color: #008000;color: black;">&#40;</span>instance<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Raise<span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> libvlc_exception_t ex<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
      <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_raised</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">!=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">&#41;</span>
        MessageBox<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Show</span><span style="color: #008000;color: black;">&#40;</span>LibVlc<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">libvlc_exception_get_message</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #0600FF; font-weight: bold;color: blue;">ref</span> ex<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
  <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></div></div>

<p><em>Note that this section of code is deprecated and the code from <a href="http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/">part 2</a> should be used instead.</em></p>
<p>Adding a pause button is similar to the stop button but without the cleanup.</p>
<p>Here is an example slightly further on down the line but using the same code:<br />
<img src="http://www.helyar.net/wp-content/uploads/2009/05/libvlc_example.jpg" alt="Example of LibVLC" title="libvlc_example" width="512" height="315" class="size-medium wp-image-210" /></p>
<p>See <a href="http://www.helyar.net/2009/libvlc-media-player-in-c-part-2/">part 2</a> for more.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/libvlc-media-player-in-c/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>3 colour gradient</title>
		<link>http://www.helyar.net/2009/3-colour-gradient/</link>
		<comments>http://www.helyar.net/2009/3-colour-gradient/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 13:21:23 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[colour]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[curve]]></category>
		<category><![CDATA[gradient]]></category>
		<category><![CDATA[sine]]></category>

		<guid isPermaLink="false">http://www.helyar.net/blog/?p=120</guid>
		<description><![CDATA[Recently I noticed a green-red gradient that I was using wasn&#8217;t really what I wanted. I wanted it to go through yellow. I have made a Vista sidebar gadget in the past that shows different colours of the horizontal percentage bars for CPU and memory usage which faded from green at 0% to yellow at [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I noticed a green-red gradient that I was using wasn&#8217;t really what I wanted.<br />
<img alt="green-red gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/BadGradient.png" title="green-red" class="alignnone" width="100" height="20" /></p>
<p>I wanted it to go through yellow. I have made a <a href="http://www.helyar.net/files/SimpleSystemMonitor.gadget">Vista sidebar gadget</a> in the past that shows different colours of the horizontal percentage bars for CPU and memory usage which faded from green at 0% to yellow at 50% and then faded from yellow at 50% to red at 100%. I had thought this solved the problem until I tried to use that same formula for a gradient, which turned out to be a triangular gradient.<br />
<img alt="green-yellow-red triangle gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/TriangleGradient.png" title="green-red" class="alignnone" width="100" height="20" /></p>
<p>The problem here is that there is only yellow at the very peak of the triangle so it looks pinched. From here it is obvious that a curve is needed. I first looked into Bezier curves, as you can join two of them easily by using the same points on both. However, this seemed a bit complicated. I next used a bell curve, which is actually a <a href="http://en.wikipedia.org/wiki/Gaussian_function">Gaussian function</a>. This function is e<sup>-x<sup>2</sup></sup>. This worked well and I used it throughout the development of this gradient but after I was finished I realised that a simple Sine wave from 0 to PI would have sufficed (and produces almost exactly the same result as a Gaussian function). A better function would be a Cosine wave from -PI to PI, as this gives a smooth gradient at either end that repeats perfectly. However, this would need to be normalised so that it takes a percent from 0.0 to 1.0 and outputs a value from 0.0 to 1.0 <code>y = (cos((x*2-1)*pi)+1)/2</code>, which is easy to do in a simple Sine 0 to PI because it is done just by multiplying the input by PI.</p>
<p>The key to this is that when it hits the peak, at 50%, it changes from a green-yellow gradient to a red-yellow gradient. The sine function is not used directly to determine the colour but rather to determine where on a simple colour gradient to choose the colour from, which allows it to be used with any combination of colours. The end result is this:<br />
<img alt="green-yellow-red sine gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/Sine.png" title="green-red" class="alignnone" width="100" height="20" /> (sine)<br />
<img alt="green-yellow-red cosine gradient" src="http://www.helyar.net/wp-content/uploads/2009/03/Cosine.png" title="green-red" class="alignnone" width="100" height="20" /> (cosine)</p>
<p>C# code listing (for ASPX) is as follows:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;color: black;"><span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;color: black;">;</span>
<span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008080;">System.Drawing.Imaging</span><span style="color: #008000;color: black;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">partial</span> <span style="color: #6666cc; font-weight: bold;color: blue;">class</span> PercentBar <span style="color: #008000;color: black;">:</span> <span style="color: #000000;">System.<span style="color: #0000FF;color: black;">Web</span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">UI</span></span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Page</span>
<span style="color: #008000;color: black;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;color: blue;">protected</span> <span style="color: #6666cc; font-weight: bold;color: blue;">void</span> Page_Load<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">object</span> sender, EventArgs e<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008000;color: black;">&#40;</span>Bitmap bmp <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> Bitmap<span style="color: #008000;color: black;">&#40;</span><span style="color: #FF0000;color: maroon;">100</span>, <span style="color: #FF0000;color: maroon;">20</span>, PixelFormat<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Format24bppRgb</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span>
        <span style="color: #008000;color: black;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> w <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">double</span><span style="color: #008000;color: black;">&#41;</span>bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Width</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">for</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span> x <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span> x <span style="color: #008000;color: black;">&lt;</span> bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Width</span><span style="color: #008000;color: black;">;</span> x<span style="color: #008000;color: black;">++</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                Color c <span style="color: #008000;color: black;">=</span> GetTriColour<span style="color: #008000;color: black;">&#40;</span>x <span style="color: #008000;color: black;">/</span> w, Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Lime</span>, Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Yellow</span>, Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Red</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                <span style="color: #0600FF; font-weight: bold;color: blue;">for</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span> y <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">0</span><span style="color: #008000;color: black;">;</span> y <span style="color: #008000;color: black;">&lt;</span> bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Height</span><span style="color: #008000;color: black;">;</span> y<span style="color: #008000;color: black;">++</span><span style="color: #008000;color: black;">&#41;</span>
                    bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">SetPixel</span><span style="color: #008000;color: black;">&#40;</span>x, y, c<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;color: blue;">using</span> <span style="color: #008000;color: black;">&#40;</span><span style="color: #000000;">System.<span style="color: #0000FF;color: black;">IO</span></span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">MemoryStream</span> ms <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: blue;">new</span> <span style="color: #000000;">System.<span style="color: #0000FF;color: black;">IO</span></span><span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">MemoryStream</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #008000;color: black;">&#123;</span>
                bmp<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Save</span><span style="color: #008000;color: black;">&#40;</span>ms, ImageFormat<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Png</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
                ms<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">WriteTo</span><span style="color: #008000;color: black;">&#40;</span>Response<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">OutputStream</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
            <span style="color: #008000;color: black;">&#125;</span>
            Response<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">ContentType</span> <span style="color: #008000;color: black;">=</span> <span style="color: #666666;color: maroon;">&quot;image/png&quot;</span><span style="color: #008000;color: black;">;</span>
        <span style="color: #008000;color: black;">&#125;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> Color GetTriColour<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">double</span> percent, Color left, Color centre, Color right<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>percent <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">0</span> <span style="color: #008000;color: black;">||</span> percent <span style="color: #008000;color: black;">&gt;</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> <span style="color: #008000;color: blue;">new</span> Exception<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;Percent must be between 0 and 1&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;color: green;">//double weight = Math.Sin(percent * Math.PI);</span>
        <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> weight <span style="color: #008000;color: black;">=</span> <span style="color: #008000;color: black;">&#40;</span>Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Cos</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#40;</span>percent <span style="color: #008000;color: black;">*</span> <span style="color: #FF0000;color: maroon;">2</span> <span style="color: #008000;color: black;">-</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">PI</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">/</span> <span style="color: #FF0000;color: maroon;">2</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> GetColourFromLinearGradient<span style="color: #008000;color: black;">&#40;</span>weight,
           percent <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">0.5</span> <span style="color: #008000;color: black;">?</span> left <span style="color: #008000;color: black;">:</span> right, centre<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;color: blue;">public</span> <span style="color: #0600FF; font-weight: bold;color: blue;">static</span> Color GetColourFromLinearGradient<span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">double</span> percent, Color start, Color end<span style="color: #008000;color: black;">&#41;</span>
    <span style="color: #008000;color: black;">&#123;</span>
        <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> a, r, g, b<span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">if</span> <span style="color: #008000;color: black;">&#40;</span>percent <span style="color: #008000;color: black;">&lt;</span> <span style="color: #FF0000;color: maroon;">0</span> <span style="color: #008000;color: black;">||</span> percent <span style="color: #008000;color: black;">&gt;</span> <span style="color: #FF0000;color: maroon;">1</span><span style="color: #008000;color: black;">&#41;</span>
            <span style="color: #0600FF; font-weight: bold;color: blue;">throw</span> <span style="color: #008000;color: blue;">new</span> Exception<span style="color: #008000;color: black;">&#40;</span><span style="color: #666666;color: maroon;">&quot;Percent must be between 0 and 1&quot;</span><span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #6666cc; font-weight: bold;color: blue;">double</span> npercent <span style="color: #008000;color: black;">=</span> <span style="color: #FF0000;color: maroon;">1.0</span> <span style="color: #008000;color: black;">-</span> percent<span style="color: #008000;color: black;">;</span>
&nbsp;
        a <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">A</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        r <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">R</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        g <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">G</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
        b <span style="color: #008000;color: black;">=</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Min</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span>, end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">+</span> Math<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">Abs</span><span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span> <span style="color: #008000;color: black;">-</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span><span style="color: #008000;color: black;">&#41;</span> <span style="color: #008000;color: black;">*</span> <span style="color: #008000;color: black;">&#40;</span>start<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span> <span style="color: #008000;color: black;">&gt;</span> end<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">B</span> <span style="color: #008000;color: black;">?</span> npercent <span style="color: #008000;color: black;">:</span> percent<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;color: blue;">return</span> Color<span style="color: #008000;color: black;">.</span><span style="color: #0000FF;color: black;">FromArgb</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>a, <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>r, <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>g, <span style="color: #008000;color: black;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: blue;">int</span><span style="color: #008000;color: black;">&#41;</span>b<span style="color: #008000;color: black;">&#41;</span><span style="color: #008000;color: black;">;</span>
    <span style="color: #008000;color: black;">&#125;</span>
<span style="color: #008000;color: black;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/3-colour-gradient/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

