IPB

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
Tiny Decoder *read_stream implementation, How to use the tiny decoder on embedded hardware
TinyTron
post May 2 2011, 15:47
Post #1





Group: Validating
Posts: 2
Joined: 2-May 11
Member No.: 90268



Hi there,

I'm trying to implement a WavPack decoder on embedded hardware using a ARM Cortex-M3 hardware.
The code I use is from the Tiny Decoder package from the downloads page, version is 4.40. I'm using the C-version, no assembler code is used.

The wavpack file is on a FAT formatted SD-Card, I'm able to read both the SD card blockwise, as well as the FAT-system blockwise. Blocks are 512 bytes wide.
My implementation is incompatible to the format of the read_stream, so I try to implement a "translator" function.

I'm not sure, if I get it right:
CODE
typedef int32_t (*read_stream)(void *, int32_t);

This implements the stream access - I assume, my function has to return a int32-value of how many bytes it could read and write the bytes to a buffer, void* points to (should it be a char*), the number of bytes that should be read is passed to the function as int32_t?

Has anyone tried to get the decoder running on an ARM processor?
Is there a port of the assembler part to thumb2-instructions?

Thanks in advance!

Best regards
TinyTron
Go to the top of the page
+Quote Post
saratoga
post May 2 2011, 16:21
Post #2





Group: Members
Posts: 5119
Joined: 2-September 02
Member No.: 3264



QUOTE (TinyTron @ May 2 2011, 10:47) *
I'm trying to implement a WavPack decoder on embedded hardware using a ARM Cortex-M3 hardware.


Thats an interesting choice. Why such an odd ARM processor?


QUOTE (TinyTron @ May 2 2011, 10:47) *
The wavpack file is on a FAT formatted SD-Card, I'm able to read both the SD card blockwise, as well as the FAT-system blockwise. Blocks are 512 bytes wide.
My implementation is incompatible to the format of the read_stream, so I try to implement a "translator" function.


So you want to do something like we do in rockbox, where the file is streamed a few KB at a time from storage, decode it, then do the next few KB? Heres our code:

http://svn.rockbox.org/viewvc.cgi/trunk/ap...amp;view=markup
http://svn.rockbox.org/viewvc.cgi/trunk/ap...ecs/libwavpack/

QUOTE (TinyTron @ May 2 2011, 10:47) *
Has anyone tried to get the decoder running on an ARM processor?
Is there a port of the assembler part to thumb2-instructions?


I've never heard of someone using the Thumb2 processors for audio, but I think its not too different from standard ARMv4, so you could probably adapt our assembly.
Go to the top of the page
+Quote Post
TinyTron
post May 3 2011, 10:53
Post #3





Group: Validating
Posts: 2
Joined: 2-May 11
Member No.: 90268



Hi there,

thanks for your reply! The Rockbox code looks good, have to go through it yet.

QUOTE (saratoga @ May 2 2011, 16:21) *
Thats an interesting choice. Why such an odd ARM processor?


It's not that odd for me wink.gif. We're using it for several projects, so it was the processor of choice, because of tools and experience with it.

QUOTE (saratoga @ May 2 2011, 16:21) *
I've never heard of someone using the Thumb2 processors for audio, but I think its not too different from standard ARMv4, so you could probably adapt our assembly.


Well, I'm programming using C, so assembler needs extra effort. Because Thumb doesn't work on the Cortex-M3-cores, it has to be rewritten. I'll test the performance using the C code, than adapt the assembly.

Best regards
TinyTron
Go to the top of the page
+Quote Post
bryant
post May 3 2011, 18:04
Post #4


WavPack Developer


Group: Developer (Donating)
Posts: 1292
Joined: 3-January 02
From: San Francisco CA
Member No.: 900



QUOTE (TinyTron @ May 2 2011, 07:47) *
CODE
typedef int32_t (*read_stream)(void *, int32_t);

This implements the stream access - I assume, my function has to return a int32-value of how many bytes it could read and write the bytes to a buffer, void* points to (should it be a char*), the number of bytes that should be read is passed to the function as int32_t?

Yes, I think your understanding is correct. The only thing is that the stream reader function MUST read the number of bytes requested (and return that number) unless the stream is exhausted (i.e., EOF). If your "translator" function can only read 512 bytes from the filesystem at a time, then it will need to maintain a 512 byte buffer to hold any leftover bytes between calls from the tiny decoder.

BTW, the read_stream() function is almost identical to the standard Posix read() except that no file descriptor is passed in.

The ARM assembly routines provide some improvement in performance, but it's not huge (maybe 30% faster) and so it's quite likely that the C version will work fine for you unless you have some unfortunate combination of very high sampling rate and low CPU clock speed.

Please feel free to let me know if you run into any trouble or have other questions! smile.gif

David

Go to the top of the page
+Quote Post
sanks85
post Mar 5 2013, 10:25
Post #5





Group: Members
Posts: 2
Joined: 5-March 13
Member No.: 107026



Hello guys
I am trying to port vorbis on cortex m4 but i couldn't find any descriptive guideline for same.
I am a newbie in this field but after i came across this post, i felt like you guys have pretty good knowledge in same.
Any help would be appreciable.

THANKS ALOT. smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 



RSS Lo-Fi Version Time is now: 28th November 2014 - 10:48