<?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>debit.nl &#187; Alchemy</title>
	<atom:link href="http://blog.debit.nl/category/alchemy/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.debit.nl</link>
	<description>Freelance developer</description>
	<lastBuildDate>Wed, 30 Jun 2010 21:01:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Using ByteArrays in Actionscript and Alchemy</title>
		<link>http://blog.debit.nl/2009/03/using-bytearrays-in-actionscript-and-alchemy/</link>
		<comments>http://blog.debit.nl/2009/03/using-bytearrays-in-actionscript-and-alchemy/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 22:23:55 +0000</pubDate>
		<dc:creator>Bernard</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Alchemy]]></category>
		<category><![CDATA[Source]]></category>

		<guid isPermaLink="false">http://blog.debit.nl/?p=79</guid>
		<description><![CDATA[A few days ago I got the question how I did the transfer of data between Actionscript and C (Alchemy).
There are a few ways to push ByteArrays back and forth, I will give some examples of the methods I used.


fopen and supplyFile
Alchemy C:
#include
#include 
&#160;
#include &#34;AS3.h&#34;
&#160;
static AS3_Val readFile&#40;void* self, AS3_Val args&#41;
&#123;
	char * fileName;
	FILE * file;
	long fileSize;
	char [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago I got the question how I did the transfer of data between Actionscript and C (Alchemy).<br />
There are a few ways to push ByteArrays back and forth, I will give some examples of the methods I used.<br />
<span id="more-79"></span><br />
<strong><br />
fopen and supplyFile</strong></p>
<p>Alchemy C:</p>
<pre class="c"><span style="color: #339933;">#include</span>
<span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #339933;">#include &quot;AS3.h&quot;</span>
&nbsp;
<span style="color: #993333;">static</span> AS3_Val readFile<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span>* self, AS3_Val args<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">char</span> * fileName;
	FILE * file;
	<span style="color: #993333;">long</span> fileSize;
	<span style="color: #993333;">char</span> * buffer;
&nbsp;
	AS3_ArrayValue<span style="color: #66cc66;">&#40;</span>args, <span style="color: #ff0000;">&quot;StrType&quot;</span>, &amp;fileName<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	file = fopen<span style="color: #66cc66;">&#40;</span>fileName,<span style="color: #ff0000;">&quot;rb&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Get file size</span>
	fseek <span style="color: #66cc66;">&#40;</span>file, <span style="color: #cc66cc;">0</span>, SEEK_END<span style="color: #66cc66;">&#41;</span>;
	fileSize = ftell<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
	rewind<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Allocate buffer</span>
	buffer = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span> malloc<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span><span style="color: #66cc66;">&#41;</span>*fileSize<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Read file into buffer</span>
	fread<span style="color: #66cc66;">&#40;</span>buffer, <span style="color: #cc66cc;">1</span>, fileSize, file<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//close file and free allocated buffer</span>
	fclose <span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
	free <span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> AS3_String<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span>buffer<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	AS3_Val readMethod = AS3_Function<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, readFile<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	AS3_Val result = AS3_Object<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;readFile: AS3ValType&quot;</span>, readMethod<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	AS3_Release<span style="color: #66cc66;">&#40;</span>readMethod<span style="color: #66cc66;">&#41;</span>;
	AS3_LibInit<span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Actionscript:</p>
<pre class="actionscript">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> cmodule.<span style="color: #006600;">dataTest1</span>.<span style="color: #006600;">CLibInit</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">ByteArray</span>;		
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> loader:CLibInit = <span style="color: #000000; font-weight: bold;">new</span> CLibInit<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> lib:<span style="color: #0066CC;">Object</span> = loader.<span style="color: #006600;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> byteArray:ByteArray = <span style="color: #000000; font-weight: bold;">new</span> ByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			byteArray.<span style="color: #006600;">writeUTFBytes</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Hello World!&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			loader.<span style="color: #006600;">supplyFile</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;testFile.txt&quot;</span>, byteArray<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>lib.<span style="color: #006600;">readFile</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;testFile.txt&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>The method of reading a "file" as shown above is read-only in C. That's not because I opened the file "rb" (Read Binary) that's just the way it is. But as you can see it's a really simple solution to read data in C. The bytearray you provide can be any bytearray you like, for example: data from a FileReference.<br />
The filename is a unique identifier for the bytearray. You could just use fopen("testFile.txt","rb") in C and not give the filename as an argument.</p>
<p><strong><br />
Memory allocation in C with direct access in Actionscript (FAST!!)</strong></p>
<p>Alchemy C:</p>
<pre class="c"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #339933;">#include &quot;AS3.h&quot;</span>
&nbsp;
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>* buffer;
<span style="color: #993333;">int</span> bufferSize;
&nbsp;
<span style="color: #993333;">static</span> AS3_Val initByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span>* self, AS3_Val args<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
&nbsp;
	AS3_ArrayValue<span style="color: #66cc66;">&#40;</span>args, <span style="color: #ff0000;">&quot;IntType&quot;</span>, &amp;bufferSize<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Allocate buffer of size &quot;bufferSize&quot;</span>
	buffer = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span>malloc<span style="color: #66cc66;">&#40;</span>bufferSize*<span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//return pointer to the location in memory</span>
	<span style="color: #b1b100;">return</span> AS3_Int<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span><span style="color: #66cc66;">&#41;</span>buffer<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> AS3_Val writeData<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span>* self, AS3_Val args<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #993333;">char</span> *tempBuffer;
	AS3_ArrayValue<span style="color: #66cc66;">&#40;</span>args, <span style="color: #ff0000;">&quot;StrType&quot;</span>, &amp;tempBuffer<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//copy string to buffer</span>
	strcpy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span>buffer, <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span>tempBuffer<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> AS3_String<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span>tempBuffer<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> AS3_Val clearByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span>* self, AS3_Val args<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;">//free the buffer</span>
	free<span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">&#41;</span>;
	*buffer = <span style="color: #cc66cc;">0</span>;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	AS3_Val initByteArrayMethod = AS3_Function<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, initByteArray<span style="color: #66cc66;">&#41;</span>;
	AS3_Val writeDataMethod = AS3_Function<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, writeData<span style="color: #66cc66;">&#41;</span>;
	AS3_Val clearByteArrayMethod = AS3_Function<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, clearByteArray<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	AS3_Val result = AS3_Object<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;initByteArray:AS3ValType, writeData:AS3ValType, clearByteArray:AS3ValType&quot;</span>, initByteArrayMethod, writeDataMethod, clearByteArrayMethod<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	AS3_Release<span style="color: #66cc66;">&#40;</span>initByteArrayMethod<span style="color: #66cc66;">&#41;</span>;
	AS3_Release<span style="color: #66cc66;">&#40;</span>writeDataMethod<span style="color: #66cc66;">&#41;</span>;
	AS3_Release<span style="color: #66cc66;">&#40;</span>clearByteArrayMethod<span style="color: #66cc66;">&#41;</span>;
	AS3_LibInit<span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Actionscript:</p>
<pre class="actionscript">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> cmodule.<span style="color: #006600;">dataTest2</span>.<span style="color: #006600;">CLibInit</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">ByteArray</span>;		
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _dataPosition:uint;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> loader:CLibInit = <span style="color: #000000; font-weight: bold;">new</span> CLibInit<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> lib:<span style="color: #0066CC;">Object</span> = loader.<span style="color: #006600;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> ns:Namespace = <span style="color: #000000; font-weight: bold;">new</span> Namespace<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cmodule.dataTest2&quot;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> byteArray:ByteArray = <span style="color: #66cc66;">&#40;</span>ns::gstate<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">ds</span>; <span style="color: #808080; font-style: italic;">//point to memory</span>
&nbsp;
			_dataPosition = lib.<span style="color: #006600;">initByteArray</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//This is the position of the data in memory			</span>
&nbsp;
			lib.<span style="color: #006600;">writeData</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Hello &quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//example function to write data in C</span>
&nbsp;
			byteArray.<span style="color: #0066CC;">position</span> = _dataPosition + <span style="color: #cc66cc;">6</span>; <span style="color: #808080; font-style: italic;">//Move to the next free location</span>
&nbsp;
			byteArray.<span style="color: #006600;">writeUTFBytes</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;World!&quot;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//write text at the current position</span>
&nbsp;
			byteArray.<span style="color: #0066CC;">position</span> = _dataPosition; <span style="color: #808080; font-style: italic;">//reset position</span>
&nbsp;
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>byteArray.<span style="color: #006600;">readUTFBytes</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//read bytearray</span>
&nbsp;
			lib.<span style="color: #006600;">clearByteArray</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//Free the bytearray</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>This method is the fastest method to use data between C and Actionscript. In C you allocate a chunk of memory of the given size and it's position is returned to Actionscript. In Actionscript you can set a reference to the Alchemy memory as shown with the namespace.<br />
You MUST postition the bytearray to the position given back by C, because that's where your data is.</p>
<p>I've tested this method with coloring a 640x400px bitmap looping over the rainbow colors.<br />
I applied the bytearray to the bitmap with setPixels(ba:ByteArray, rect:Rectangle); and filled the 640x400 bytearray in both Actionscript and C. I was very surprised about the difference in speed.<br />
In Actionscript the framerate maxed out at 10fps, but filling the bytearray in C gave me a rate of 60fps (max on my mac).</p>
<p><strong><br />
funopen and bytearray pointer</strong></p>
<p>Alchemy C:</p>
<pre class="c"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339933;">#include &quot;AS3.h&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Does a FILE * read against a ByteArray */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> readByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *cookie, <span style="color: #993333;">char</span> *dst, <span style="color: #993333;">int</span> size<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> AS3_ByteArray_readBytes<span style="color: #66cc66;">&#40;</span>dst, <span style="color: #66cc66;">&#40;</span>AS3_Val<span style="color: #66cc66;">&#41;</span>cookie, size<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Does a FILE * write against a ByteArray */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> writeByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *cookie, <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> *src, <span style="color: #993333;">int</span> size<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> AS3_ByteArray_writeBytes<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>AS3_Val<span style="color: #66cc66;">&#41;</span>cookie, <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span> *<span style="color: #66cc66;">&#41;</span>src, size<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Does a FILE * lseek against a ByteArray */</span>
<span style="color: #993333;">static</span> fpos_t seekByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *cookie, fpos_t offs, <span style="color: #993333;">int</span> whence<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> AS3_ByteArray_seek<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>AS3_Val<span style="color: #66cc66;">&#41;</span>cookie, offs, whence<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Does a FILE * close against a ByteArray */</span>
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> closeByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> * cookie<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	AS3_Val zero = AS3_Int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">/* just reset the position */</span>
	AS3_SetS<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>AS3_Val<span style="color: #66cc66;">&#41;</span>cookie, <span style="color: #ff0000;">&quot;position&quot;</span>, zero<span style="color: #66cc66;">&#41;</span>;
	AS3_Release<span style="color: #66cc66;">&#40;</span>zero<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> AS3_Val doMagic<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span>* self, AS3_Val args<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	FILE * file;
	<span style="color: #993333;">long</span> fileSize;
	<span style="color: #993333;">char</span> * buffer;
	<span style="color: #993333;">void</span> * dest;
&nbsp;
	AS3_ArrayValue<span style="color: #66cc66;">&#40;</span>args, <span style="color: #ff0000;">&quot;AS3ValType&quot;</span>, &amp;dest<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	file = funopen<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>dest, readByteArray, writeByteArray, seekByteArray, closeByteArray<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #993333;">char</span> buffer2<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'H'</span>,<span style="color: #ff0000;">'e'</span>,<span style="color: #ff0000;">'l'</span>,<span style="color: #ff0000;">'l'</span>,<span style="color: #ff0000;">'o'</span>,<span style="color: #ff0000;">' '</span>,<span style="color: #ff0000;">'W'</span>,<span style="color: #ff0000;">'o'</span>,<span style="color: #ff0000;">'r'</span>,<span style="color: #ff0000;">'l'</span>,<span style="color: #ff0000;">'d'</span>,<span style="color: #ff0000;">'!'</span><span style="color: #66cc66;">&#125;</span>;
&nbsp;
	fwrite <span style="color: #66cc66;">&#40;</span>buffer2, <span style="color: #cc66cc;">1</span>, <span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span>buffer2<span style="color: #66cc66;">&#41;</span>, file<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">// get file size</span>
	fseek <span style="color: #66cc66;">&#40;</span>file, <span style="color: #cc66cc;">0</span>, SEEK_END<span style="color: #66cc66;">&#41;</span>;
	fileSize = ftell<span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
	rewind <span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Allocate memory for the buffer</span>
	buffer = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span> malloc <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span><span style="color: #66cc66;">&#41;</span>*fileSize<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Copy the file into the buffer</span>
	fread <span style="color: #66cc66;">&#40;</span>buffer, <span style="color: #cc66cc;">1</span>, fileSize, file<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #808080; font-style: italic;">//Close file and clear</span>
	fclose <span style="color: #66cc66;">&#40;</span>file<span style="color: #66cc66;">&#41;</span>;
	free <span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> AS3_String<span style="color: #66cc66;">&#40;</span>buffer<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	AS3_Val doMagicMethod = AS3_Function<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">NULL</span>, doMagic<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	AS3_Val result = AS3_Object<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;doMagic:AS3ValType&quot;</span>, doMagicMethod<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	AS3_Release<span style="color: #66cc66;">&#40;</span>doMagicMethod<span style="color: #66cc66;">&#41;</span>;
	AS3_LibInit<span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>ActionScript:</p>
<pre class="actionscript">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> cmodule.<span style="color: #006600;">dataTest3</span>.<span style="color: #006600;">CLibInit</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">ByteArray</span>;		
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> loader:CLibInit = <span style="color: #000000; font-weight: bold;">new</span> CLibInit<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> lib:<span style="color: #0066CC;">Object</span> = loader.<span style="color: #006600;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> byteArray:ByteArray = <span style="color: #000000; font-weight: bold;">new</span> ByteArray<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> result:<span style="color: #0066CC;">String</span> = lib.<span style="color: #006600;">doMagic</span><span style="color: #66cc66;">&#40;</span>byteArray<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>result<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>byteArray.<span style="color: #006600;">readUTFBytes</span><span style="color: #66cc66;">&#40;</span>byteArray.<span style="color: #0066CC;">length</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>As you can see you pass a ByteArray to C and it uses funopen to open the bytearray as a FILE. The functions provided at the funopen function map the FILE functions to bytearray functions, so the bytearray acts as a file.<br />
In ActionScript you can see that the bytearray holds the data C has writen to it.<br />
This way you can use normal FILE function in C and for example save the data in Actionscript with the FileReference.</p>
<p>If you have any questions or remarks please let me hear them!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.debit.nl/2009/03/using-bytearrays-in-actionscript-and-alchemy/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>MP3 encoder in Flash with Alchemy</title>
		<link>http://blog.debit.nl/2009/03/mp3-encoder-in-flash-with-alchemy/</link>
		<comments>http://blog.debit.nl/2009/03/mp3-encoder-in-flash-with-alchemy/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 14:44:42 +0000</pubDate>
		<dc:creator>Bernard</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Alchemy]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://blog.debit.nl/?p=67</guid>
		<description><![CDATA[A week ago I started playing with Adobe Alchemy. First just a few return values or simple calculations.
After a few days of playing and testing I thought it would be nice to have a MP3 Encoder in flash.
With the new Sound.extract method in Actionscript you can get raw data like a "WAV" but there is [...]]]></description>
			<content:encoded><![CDATA[<p>A week ago I started playing with Adobe Alchemy. First just a few return values or simple calculations.<br />
After a few days of playing and testing I thought it would be nice to have a MP3 Encoder in flash.<br />
With the new Sound.extract method in Actionscript you can get raw data like a "WAV" but there is no easy way to compress this data.</p>
<p>I started searching for C code which implements a MP3 Encoder and found the 8Hz MP3 implementation.<br />
I could have used LAME, but hey.. have you looked at the file count!<br />
The 8Hz implementation uses about 10 files, so it's readable. It's not the best encoder, but good enough to test the possibilities.</p>
<p>I was very surprised that the 8Hz code would compile with llvm-gcc (Alchemy)! That is a good starting point, now I only have to rewrite some code to get input from and output to Actionscript.</p>
<p>The original source used fopen to read and write files. This isn't possible with Alchemy so I replaced fopen with funopen and gave a pointer to Actionscript bytearrays.</p>
<p>The next problem I encountered was the execution timeout in Flash. When encoding large WAV files (more then 30 seconds of sound on my MacBook Pro) the flashplayer will trigger an error about exceeding the maximum execution time. I tried to alter it with the compiler option "-default-script-limits" but no luck (maybe it has something to do with Alchemy).<br />
But it forced me to take a deeper look in the encoding source. I've rewritten the layer3.c file to process a few frames and then give feedback to Actionscript. This way no timeout occurs.</p>
<p>I'm still working on speed optimization, because encoding is slow at the moment.<br />
I will keep you updated!</p>
<p>Here is the first version:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_mp3encoder_v1_1918742524"
			class="flashmovie"
			width="260"
			height="80">
	<param name="movie" value="/wp-content/uploads/2009/03/mp3encoder_v1.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="/wp-content/uploads/2009/03/mp3encoder_v1.swf"
			name="fm_mp3encoder_v1_1918742524"
			width="260"
			height="80">
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer">Get Adobe Flash player</a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://blog.debit.nl/2009/03/mp3-encoder-in-flash-with-alchemy/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
	</channel>
</rss>

