release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Search | Go
Wiki > Main > SoftwareCodecPlayback > RockboxPCMPlayback

The PCM buffer

This page is part of an attempt to document the software codec playback code.

General

The PCM buffer contains raw PCM data to be (or being) sent to the audio output. The codecs allocate space in the buffer and puts the decoded audio in the allocated space. It has two auxiliary buffers, the crossfade and voice buffers, used for mixing.

Regular PCM playback

You can allocate space in the buffer for later playback by calling the pcmbuf_request_buffer() function. It will reserve space in the buffer which will later be queued for playback when you call the pcmbuf_write_complete() function.

Step 1 - allocate buffer space

When you want to add a chunk of audio to the PCM buffer, you must first reserve the buffer space. Here's how the buffer may look before you begin. DirectedGraph Error (25):
*DirectedGraphPlugin error:* 
$GV_FILE_PATH environment variable set; exiting
01: 
02: This sandboxing mechanism is no longer supported
03: Problem executing /usr/bin/dot: '/usr/bin/dot  /home/rockbox/foswiki/working/tmp/DiGraphPluginpQRapDKFOk.dot -Tpng -o/home/rockbox/foswiki/working/tmp/DGPLgaeWggwLb.png  2> /home/rockbox/foswiki/working/tmp/DiGraphPluginpQRapDKFOk.dot.err ', got:
04: /usr/bin/dot exited with rc=1
05:  

You then reserve some space:
char *ptr;   /* Pointer to the requested buffer */
size_t size; /* How many bytes I managed to reserve */

ptr = pcmbuf_request_buffer(0x2000, &size);

/* The 'size' variable now holds the number of bytes reserved */

Step 2 - Fill with data and queue it

You have now reserved buffer space for your audio data, but the buffer is not yet added to the PCM queue for playback. It is now time to fill the buffer with PCM data.

DirectedGraph Error (25):
*DirectedGraphPlugin error:* 
$GV_FILE_PATH environment variable set; exiting
01: 
02: This sandboxing mechanism is no longer supported
03: Problem executing /usr/bin/dot: '/usr/bin/dot  /home/rockbox/foswiki/working/tmp/DiGraphPluginPB6sn0slJ2.dot -Tpng -o/home/rockbox/foswiki/working/tmp/DGPP2vl5Dy1xe.png  2> /home/rockbox/foswiki/working/tmp/DiGraphPluginPB6sn0slJ2.dot.err ', got:
04: /usr/bin/dot exited with rc=1
05:  

You now fill the buffer with audio data and call pcmbuf_write_complete() to add the audio data to the PCM queue. In this example, I fill it with zeroes.
memset(ptr, 0, size);

pcmbuf_write_complete(size);

/* After this, the 'ptr' pointer is no longer valid */

DirectedGraph Error (25):
*DirectedGraphPlugin error:* 
$GV_FILE_PATH environment variable set; exiting
01: 
02: This sandboxing mechanism is no longer supported
03: Problem executing /usr/bin/dot: '/usr/bin/dot  /home/rockbox/foswiki/working/tmp/DiGraphPluginZaDgEDtjFu.dot -Tpng -o/home/rockbox/foswiki/working/tmp/DGP8R00mImZFH.png  2> /home/rockbox/foswiki/working/tmp/DiGraphPluginZaDgEDtjFu.dot.err ', got:
04: /usr/bin/dot exited with rc=1
05:  

Special case 1 - crossfade

coming

Special case 2 - voice

coming

r16 - 29 Oct 2023 - 16:24:05 - AdminUser

Copyright © by the contributing authors.