# Audio Streaming

You can stream audio from a URL. This is useful to play music directly from an internet radio, or stream a conference into your scene.

{% hint style="info" %}
**💡 Tip**: In the [Scene Editor in Creator Hub](https://docs.decentraland.org/creator/scene-editor/get-started/about-editor), you can use an **Audio Stream** [Smart Item](https://docs.decentraland.org/creator/scene-editor/interactivity/smart-items) for a no-code way to achieve this.
{% endhint %}

The audio in the source must be in one of the following formats: `.mp3`, `ogg`, or `aac`. The source must also be an *https* URL (*http* URLs aren't supported), and the source should have [CORS policies (Cross Origin Resource Sharing)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) that permit externally accessing it. If this is not the case, you might need to set up a server to act as a proxy and expose the stream in a valid way.

{% hint style="warning" %}
**📔 Note**: To instead play a pre-recorded sound in your scene, see [Sounds](https://docs.decentraland.org/creator/scenes-sdk7/3d-content-essentials/sounds).
{% endhint %}

To add an audio stream into your scene, simply add an `AudioStream` component to an entity:

```ts
const streamEntity = engine.addEntity()

AudioStream.create(streamEntity, {
	url: 'https://icecast.ravepartyradio.org/ravepartyradio-192.mp3',
	playing: true,
	volume: 0.8,
})
```

{% hint style="warning" %}
**📔 Note**: The streamed sound isn't positional, it will be heard at a consistent volume throughout your entire scene. If a player steps out of the scene, they will not hear the streaming at all.
{% endhint %}

Set the volume of the `AudioStream` component by changing its `volume` property.

Switch the `AudioStream` component on or off by setting its `playing` property to *true* or *false*.

{% hint style="info" %}
**📔 Note**: Not all streaming services allow you to play their audio outside their site. The following are some examples that work in Decentraland:

```ts
DELTA = "https://cdn.instream.audio/:9069/stream?_=171cd6c2b6e"
GRAFFITI = "https://n07.radiojar.com/2qm1fc5kb.m4a?1617129761=&rj-tok=AAABeIR7VqwAilDFeUM39SDjmw&rj-ttl=5"
ISLA NEGRA = "https://radioislanegra.org/listen/up/basic.aac"
```

{% endhint %}

## Stream state

Query the state of an audio stream using the function `AudioStream.getAudioState()`, passing the entity that owns the `AudioStream` component.

The returned state is a value of the `MediaState` enum. This enum has the following possible values:

* `MS_BUFFERING`
* `MS_ERROR`
* `MS_LOADING`
* `MS_NONE`
* `MS_PAUSED`
* `MS_PLAYING`
* `MS_READY`
* `MS_SEEKING`

The following example checks on the state of a stream, and logs when there's a change.

```ts
export function main() {
	const entity = engine.addEntity()

	AudioStream.create(entity, {
		playing: true,
		volume: 1,
		url: 'https://audio-edge-es6pf.mia.g.radiomast.io/ref-128k-mp3-stereo',
	})

	let lastState: ReturnType<typeof AudioStream.getAudioState> = undefined
	engine.addSystem(() => {
		const currentState = AudioStream.getAudioState(entity)
		if (lastState !== currentState) {
			console.log('Stream state: ', currentState)

			if (currentState == MediaState.MS_ERROR) {
				// Attempt reconnection
			}
		}
	})
}
```

## Spatial audio

By default, the audio from an `AudioStream` component is global, meaning it will be heard at a consistent volume throughout your entire scene. If a player steps out of the scene, they will not hear the streaming at all.

To make the audio spatial, set the `spatial` property to *true*.

```ts
AudioStream.create(entity, {
	url: 'https://radioislanegra.org/listen/up/stream',
    playing: true,
	spatial: true,
})
```

The audio will now be heard from the position of the entity that owns the `AudioStream` component, and will be louder as the player approaches it.

Control the spatial audio with the following properties:

* `spatialMinDistance`: The minimum distance at which audio becomes spatial. If the player is closer, the audio will be heard at full volume. *0* by default.
* `spatialMaxDistance`: The maximum distance at which the audio is heard. If the player is further away, the audio will be heard at 0 volume. *60* by default

```ts
const audioStreamEntity = engine.addEntity();

Transform.create(audioStreamEntity, {
    position: Vector3.create(8, 0, 8),
});

AudioStream.create(audioStreamEntity, {
    url: 'https://radioislanegra.org/listen/up/stream',
    playing: true,
    volume: 1.0,
    spatial: true,
    spatialMinDistance: 5,
    spatialMaxDistance: 10
});
```

{% hint style="warning" %}
**📔 Note**: Some audio formats don't support spatial audio. Make sure the stream audio is encoded in *mp3*, *AAC-LC* or *FLAC*.
{% endhint %}
