# `Dala.Audio`
[🔗](https://github.com/manhvu/dala/blob/main/lib/dala/audio.ex#L1)

Microphone recording and audio playback.

Recording requires `:microphone` permission (`Dala.Permissions.request/2`).
Playback requires no permission.

## Recording

    Dala.Audio.start_recording(socket, format: :aac, quality: :medium)
    Dala.Audio.stop_recording(socket)
    # → handle_info({:audio, :recorded, %{path: path, duration: seconds}}, socket)
    # → handle_info({:audio, :error,    reason},                            socket)

## Playback

    Dala.Audio.play(socket, "/path/to/file.m4a")
    Dala.Audio.play(socket, "/path/to/file.m4a", loop: true, volume: 0.8)
    Dala.Audio.stop_playback(socket)
    Dala.Audio.set_volume(socket, 0.5)
    # → handle_info({:audio, :playback_finished, %{path: path}}, socket)
    # → handle_info({:audio, :playback_error,    %{reason: reason}}, socket)

iOS: `AVAudioPlayer` / `AVPlayer`. Android: `MediaPlayer`.

# `format`

```elixir
@type format() :: :aac | :wav
```

# `quality`

```elixir
@type quality() :: :low | :medium | :high
```

# `play`

```elixir
@spec play(Dala.Socket.t(), String.t(), keyword()) :: Dala.Socket.t()
```

Play an audio file. Stops any currently playing audio first.

Options:
  - `loop: boolean` (default `false`)
  - `volume: float 0.0–1.0` (default `1.0`)

Result arrives as:
  - `{:audio, :playback_finished, %{path: path}}`
  - `{:audio, :playback_error, %{reason: reason}}`

# `set_volume`

```elixir
@spec set_volume(Dala.Socket.t(), float()) :: Dala.Socket.t()
```

Adjust playback volume (0.0–1.0) without stopping playback.

# `start_recording`

```elixir
@spec start_recording(
  Dala.Socket.t(),
  keyword()
) :: Dala.Socket.t()
```

Start recording audio from the microphone.

Options:
  - `format: :aac | :wav` (default `:aac`)
  - `quality: :low | :medium | :high` (default `:medium`)

# `stop_playback`

```elixir
@spec stop_playback(Dala.Socket.t()) :: Dala.Socket.t()
```

Stop the currently playing audio.

# `stop_recording`

```elixir
@spec stop_recording(Dala.Socket.t()) :: Dala.Socket.t()
```

Stop the in-progress recording and save it to a temp file.
Result arrives as `{:audio, :recorded, %{path: ..., duration: ...}}`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
