# AudioContext

<a id="audiocontext"></a>

# AudioContext

```cpp
#include <icy/av/audiocontext.h>

struct AudioContext
```

[Defined in src/av/include/icy/av/audiocontext.h:39](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L39)

> **Subclassed by:** [`AudioDecoder`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder), [`AudioEncoder`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#audioencoder)

Base context for audio encoding and decoding via FFmpeg.

## Public Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal) | [`emitter`](#emitter-7)  |  |
| [`AudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCodec.md#audiocodec) | [`iparams`](#iparams)  | input parameters |
| [`AudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCodec.md#audiocodec) | [`oparams`](#oparams)  | output parameters |
| `AVStream *` | [`stream`](#stream-8)  | encoder or decoder stream |
| `AVCodecContext *` | [`ctx`](#ctx)  | encoder or decoder context |
| `const AVCodec *` | [`codec`](#codec-5)  | encoder or decoder codec |
| `AVFrame *` | [`frame`](#frame)  | last encoded or decoded frame |
| std::unique_ptr< [`AudioResampler`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioResampler.md#audioresampler) > | [`resampler`](#resampler)  | audio resampler |
| `int` | [`outputFrameSize`](#outputframesize)  | encoder or decoder output frame size |
| `int64_t` | [`time`](#time)  | stream time in codec time base |
| `int64_t` | [`pts`](#pts)  | last packet pts value |
| `double` | [`seconds`](#seconds-3)  | audio time in seconds |
| `std::string` | [`error`](#error-8)  | error message |

---

<a id="emitter-7"></a>

### emitter

```cpp
PacketSignal emitter
```

Type: [`PacketSignal`](https://auscaster.com/icey/docs/api-reference/base.md#packetsignal)

[Defined in src/av/include/icy/av/audiocontext.h:92](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L92)

---

<a id="iparams"></a>

### iparams

```cpp
AudioCodec iparams
```

Type: [`AudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCodec.md#audiocodec)

[Defined in src/av/include/icy/av/audiocontext.h:94](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L94)

input parameters

---

<a id="oparams"></a>

### oparams

```cpp
AudioCodec oparams
```

Type: [`AudioCodec`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioCodec.md#audiocodec)

[Defined in src/av/include/icy/av/audiocontext.h:95](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L95)

output parameters

---

<a id="stream-8"></a>

### stream

```cpp
AVStream * stream
```

[Defined in src/av/include/icy/av/audiocontext.h:96](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L96)

encoder or decoder stream

---

<a id="ctx"></a>

### ctx

```cpp
AVCodecContext * ctx
```

[Defined in src/av/include/icy/av/audiocontext.h:97](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L97)

encoder or decoder context

---

<a id="codec-5"></a>

### codec

```cpp
const AVCodec * codec
```

[Defined in src/av/include/icy/av/audiocontext.h:98](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L98)

encoder or decoder codec

---

<a id="frame"></a>

### frame

```cpp
AVFrame * frame
```

[Defined in src/av/include/icy/av/audiocontext.h:99](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L99)

last encoded or decoded frame

---

<a id="resampler"></a>

### resampler

```cpp
std::unique_ptr< AudioResampler > resampler
```

Type: std::unique_ptr< [`AudioResampler`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioResampler.md#audioresampler) >

[Defined in src/av/include/icy/av/audiocontext.h:100](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L100)

audio resampler

---

<a id="outputframesize"></a>

### outputFrameSize

```cpp
int outputFrameSize
```

[Defined in src/av/include/icy/av/audiocontext.h:101](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L101)

encoder or decoder output frame size

---

<a id="time"></a>

### time

```cpp
int64_t time
```

[Defined in src/av/include/icy/av/audiocontext.h:102](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L102)

stream time in codec time base

---

<a id="pts"></a>

### pts

```cpp
int64_t pts
```

[Defined in src/av/include/icy/av/audiocontext.h:103](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L103)

last packet pts value

---

<a id="seconds-3"></a>

### seconds

```cpp
double seconds
```

[Defined in src/av/include/icy/av/audiocontext.h:104](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L104)

audio time in seconds

---

<a id="error-8"></a>

### error

```cpp
std::string error
```

[Defined in src/av/include/icy/av/audiocontext.h:105](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L105)

error message

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`AudioContext`](#audiocontext-1)  |  |
|  | [`~AudioContext`](#audiocontext-2) `virtual` `noexcept` |  |
|  | [`AudioContext`](#audiocontext-3)  | Deleted constructor. |
| [`AudioContext`](#audiocontext) & | [`operator=`](#operator-149)  | Deleted assignment operator. |
|  | [`AudioContext`](#audiocontext-4)  | Deleted constructor. |
| [`AudioContext`](#audiocontext) & | [`operator=`](#operator-150)  | Deleted assignment operator. |
| `void` | [`create`](#create-2) `virtual` | Initialise the AVCodecContext with codec-specific defaults. Implemented by [AudioEncoder](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#audioencoder) and [AudioDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder). |
| `void` | [`open`](#open-2) `virtual` | Open the codec and create the resampler if input/output parameters differ. Throws std::runtime_error if the codec context has not been created. |
| `void` | [`close`](#close-9) `virtual` | Close the codec context, free the frame, and reset timestamps. |
| `bool` | [`decode`](#decode) `virtual` | Decode a compressed audio packet and emit the resulting samples. |
| `bool` | [`encode`](#encode) `virtual` | Encode a buffer of interleaved audio samples. |
| `bool` | [`encode`](#encode-1) `virtual` | Encode a buffer of planar audio samples. |
| `bool` | [`encode`](#encode-2) `virtual` | Encode a single AVFrame. |
| `void` | [`flush`](#flush-3) `virtual` | Flush any frames buffered inside the codec and emit remaining output. |
| `bool` | [`recreateResampler`](#recreateresampler) `virtual` | Recreate the [AudioResampler](https://auscaster.com/icey/docs/api-reference/icy-av-AudioResampler.md#audioresampler) using the current iparams and oparams. Called automatically by [open()](#open-2) when format conversion is required. |

---

<a id="audiocontext-1"></a>

### AudioContext

```cpp
AudioContext()
```

[Defined in src/av/include/icy/av/audiocontext.h:41](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L41)

---

<a id="audiocontext-2"></a>

### ~AudioContext

`virtual` `noexcept`

```cpp
virtual ~AudioContext() noexcept
```

[Defined in src/av/include/icy/av/audiocontext.h:42](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L42)

---

<a id="audiocontext-3"></a>

### AudioContext

```cpp
AudioContext(const AudioContext &) = delete
```

[Defined in src/av/include/icy/av/audiocontext.h:44](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L44)

Deleted constructor.

---

<a id="operator-149"></a>

### operator=

```cpp
AudioContext & operator=(const AudioContext &) = delete
```

[Defined in src/av/include/icy/av/audiocontext.h:45](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L45)

Deleted assignment operator.

---

<a id="audiocontext-4"></a>

### AudioContext

```cpp
AudioContext(AudioContext &&) = delete
```

[Defined in src/av/include/icy/av/audiocontext.h:46](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L46)

Deleted constructor.

---

<a id="operator-150"></a>

### operator=

```cpp
AudioContext & operator=(AudioContext &&) = delete
```

[Defined in src/av/include/icy/av/audiocontext.h:47](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L47)

Deleted assignment operator.

---

<a id="create-2"></a>

### create

`virtual`

```cpp
virtual void create()
```

[Defined in src/av/include/icy/av/audiocontext.h:51](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L51)

Initialise the AVCodecContext with codec-specific defaults. Implemented by [AudioEncoder](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#audioencoder) and [AudioDecoder](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#audiodecoder).

#### Reimplemented by

- [`AudioDecoder::create`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#create-3)
- [`AudioEncoder::create`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#create-4)

---

<a id="open-2"></a>

### open

`virtual`

```cpp
virtual void open()
```

[Defined in src/av/include/icy/av/audiocontext.h:55](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L55)

Open the codec and create the resampler if input/output parameters differ. Throws std::runtime_error if the codec context has not been created.

---

<a id="close-9"></a>

### close

`virtual`

```cpp
virtual void close()
```

[Defined in src/av/include/icy/av/audiocontext.h:58](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L58)

Close the codec context, free the frame, and reset timestamps.

#### Reimplemented by

- [`AudioDecoder::close`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#close-10)
- [`AudioEncoder::close`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#close-11)

---

<a id="decode"></a>

### decode

`virtual`

```cpp
virtual bool decode(AVPacket & ipacket)
```

[Defined in src/av/include/icy/av/audiocontext.h:63](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L63)

Decode a compressed audio packet and emit the resulting samples. 
#### Returns
True if one or more decoded frames were emitted, false otherwise.

#### Reimplemented by

- [`AudioDecoder::decode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#decode-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `ipacket` | `AVPacket &` | The compressed audio packet to decode. |

---

<a id="encode"></a>

### encode

`virtual`

```cpp
virtual bool encode(uint8_t * samples, int numSamples, int64_t pts)
```

[Defined in src/av/include/icy/av/audiocontext.h:70](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L70)

Encode a buffer of interleaved audio samples. 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplemented by

- [`AudioEncoder::encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#encode-3)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `samples` | `uint8_t *` | Pointer to the interleaved sample buffer. |
| `numSamples` | `int` | Number of samples per channel. |
| `pts` | `int64_t` | Presentation timestamp in stream time base units. |

---

<a id="encode-1"></a>

### encode

`virtual`

```cpp
virtual bool encode(uint8_t * samples, int numSamples, int64_t pts)
```

[Defined in src/av/include/icy/av/audiocontext.h:77](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L77)

Encode a buffer of planar audio samples. 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplemented by

- [`AudioEncoder::encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#encode-4)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `samples` | `uint8_t *` | Array of per-channel sample buffers (up to 4 planes). |
| `numSamples` | `int` | Number of samples per channel. |
| `pts` | `int64_t` | Presentation timestamp in stream time base units. |

---

<a id="encode-2"></a>

### encode

`virtual`

```cpp
virtual bool encode(AVFrame * iframe)
```

[Defined in src/av/include/icy/av/audiocontext.h:82](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L82)

Encode a single AVFrame. 
#### Returns
True if an encoded packet was produced and emitted.

#### Reimplemented by

- [`AudioEncoder::encode`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#encode-5)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `iframe` | `AVFrame *` | The source audio frame; must have all fields set correctly. |

---

<a id="flush-3"></a>

### flush

`virtual`

```cpp
virtual void flush()
```

[Defined in src/av/include/icy/av/audiocontext.h:85](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L85)

Flush any frames buffered inside the codec and emit remaining output.

#### Reimplemented by

- [`AudioDecoder::flush`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioDecoder.md#flush-4)
- [`AudioEncoder::flush`](https://auscaster.com/icey/docs/api-reference/icy-av-AudioEncoder.md#flush-5)

---

<a id="recreateresampler"></a>

### recreateResampler

`virtual`

```cpp
virtual bool recreateResampler()
```

[Defined in src/av/include/icy/av/audiocontext.h:90](https://github.com/auscaster/icey/blob/main/src/av/include/icy/av/audiocontext.h#L90)

Recreate the [AudioResampler](https://auscaster.com/icey/docs/api-reference/icy-av-AudioResampler.md#audioresampler) using the current iparams and oparams. Called automatically by [open()](#open-2) when format conversion is required. 
#### Returns
True if the resampler was successfully created.
