import { Event } from './Event'; import { ByteArray } from '../utils/ByteArray'; /** /// @eventType flash.events.SampleDataEvent.SAMPLE_DATA [Event(name="sampleData", type="flash.events.SampleDataEvent")] * Dispatched when a Sound object requests new audio data or when a Microphone object * has new audio data to provide. * *

This event has two uses:

* Dynamically generating audio using the Sound object Use the * sampleData event to play dynamically generated audio. * In this environment, * the Sound object doesn't actually contain sound data. Instead, it acts as a socket for * sound data that is being streamed to it through the use of the function * you assign as the handler for the sampleData event. *

In your function, you use the * ByteArray.writeFloat() method to write to * the event's data) property, which contains the sampled data you * want to play.

If a Sound object has not loaded an MP3 file, * when you call its play() method * the object starts dispatching sampleData events, * requesting sound samples. * The Sound object continues to send events as the sound plays back until you stop providing data, * or until the stop() method of the SoundChannel object is called. *

Thes latency of the event varies from platform to platform, and it could change in future * versions of Flash Player or AIR. Don't depend on a specific latency. * Instead calculate it using * ((SampleDataEvent.position/44.1) - SoundChannelObject.position).

* Provide between 2048 and 8192 samples to the data property of * the 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 behavior 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, tha Sound object plays the remaining samples * and then stops the sound as if the end of a sound file was reached, generating * a complete event.

* You can use the extract() method of a Sound object * to extract its sound data, * which you can then write to the dynamic stream for playback.

* When you use the sampleData event with a Sound object, * the only Sound methods that * are enabled are extract() * and play(). Calling any other methods or properties * results in an "invalid call" exception. All methods and properties of the SoundChannel object * are still enabled.

* Capturing Microphone audio Use the sampleData event * to capture audio data from a microphone. When you add an event listener for the * sampleData event, * the Microphone dispatches the event as audio samples * become available.

In the event handler function, * use the ByteArray.readFloat() method to read * the event's data) property, * which contains the sampled data. The event will contain * multiple samples, so you should use a while * loop to read the available data:

var soundBytes:ByteArray = new ByteArray(); * while(event.data.bytesAvailable) * { * var sample:Number = event.data.readFloat(); * soundBytes.writeFloat(sample); * } */ export class SampleDataEvent extends Event { /** * Defines the value of the type property of a SampleDataEvent event object. * This event has the following properties:PropertyValuebubblesfalsecancelablefalse; * there is no default behavior to cancel.positionThe point from which audio data is provided. */ public static SAMPLE_DATA: string = 'sampleData'; /** * The data in the audio stream. */ public get data (): ByteArray { console.log('data not implemented yet in flash/SampleDataEvent'); return null; } public set data (thedata: ByteArray) { console.log('data not implemented yet in flash/SampleDataEvent'); } /** * The position of the data in the audio stream. */ public get position (): number { console.log('position not implemented yet in flash/SampleDataEvent'); return 0; } public set position (theposition: number) { console.log('position not implemented yet in flash/SampleDataEvent'); } /** * Creates an event object that contains information about audio data events. * Event objects are passed as parameters to event listeners. * @param type The type of the event. This value is:Event.SAMPLE_DATA. * @param bubbles Determines whether the Event object participates in the bubbling stage of the event flow. * @param cancelable Determines whether the Event object can be canceled. * @param theposition The position of the data in the audio stream. * @param thedata A byte array of data. */ constructor (type: string, bubbles: boolean = false, cancelable: boolean = false, theposition: number = 0, thedata: ByteArray = null) { super(type, bubbles, cancelable); } /** * Creates a copy of the SampleDataEvent object and sets each property's value to match that of the original. * @return A new SampleDataEvent object with property values that match those of the original. */ public clone (): Event { console.log('clone not implemented yet in flash/SampleDataEvent'); return null; } /** * Returns a string that contains all the properties of the SampleDataEvent object. * The string is in the following format: * [SampleDataEvent type=value bubbles=value cancelable=value theposition=value thedata=value] * @return A string that contains all the properties of the SampleDataEvent object. */ public toString (): string { console.log('toString not implemented yet in flash/SampleDataEvent'); return ''; } }