Flash Player 10 Sound API changes, SampleData and SampleDataEvent
With the new beta 2 version of Flash Player 10 the Sound API has changed a bit.
Most of the changes is very straight forward and only renaming of some methods, events and properties:
SamplesCallbackEvent is now SampleDataEvent
samplesCallback is now sampleData or Event.SAMPLE_DATA
Instead of accessing Sound.samplesCallbackData to write to the output buffer one now use the SampleDataEvent.data.
Tinic Uro has updated his examples if you like to look at some example code with the new API.
So basically very straight forward changes but there was one thing that I managed to waste a bit of time on. This is what the documentation say about the buffer size for the SampleDataEvent:
Provide between 2048 and 8192 samples in a SampleDataEvent object. For best performance, provide as many samples as possible. The fewer samples you provide, the more likely it is that clicks and pops will occur during playback. This behaviour can differ on various platforms and can occur in various situations - for example, when resizing the browser. You might write code that works on one platform when you provide only 2048 samples, but that same code might not work as well when run on a different platform. If you require the lowest latency possible, consider making the amount of data user-selectable.
If you provide fewer than 2048 samples, Flash Player plays the remaining samples and then stops the sound as if the end of a sound file was reached, generating a SoundComplete event.
All my code was using a buffer size of less than 2048 and hence did not work any more.
I'm not sure why the available range has been made smaller since it was nice to be able to lower the latency by having a 512 samples buffer.
I guess it is a common problem that Flash developers are a bit irresponsible with the users CPU power and I can understand that they want to avoid the reputation of being a CPU hog, but IMHO it's a bit like if they would have decided that the maximum frame rate should be limited to 20FPS.




Thanks for this useful information, by the way:
I want to generate a chord using a couple of sin waves which is simple. But, can I generate a WAV/AIFF file too?… would that be too much ?
I’d love to redirecting the stream to a file (instead of being played).
Thanks in advance,
Paul
Hi Paul,
I guess you might have found a solution by now, but audio generated in the flash player will be 32bit floating-point PCM data.
That is a bit heavy to send directly to server if the duration is not very short, so ideally you have to convert it to 16 bit fixed-point first. If quality is a big concern one should also apply dithering at that stage to reduce quantization error.
When you have the PCM data in the desired bitdepth you just add headers to make it into a wav.