Once stream is resumed it may be required to reset some state of codec,
i.e. in case of SBC we need to reset monotonic clock and frames count
which are used for synchronization.
uint8_t *out_buf;
unsigned frame_duration;
uint8_t *out_buf;
unsigned frame_duration;
+
+ struct timespec start;
+ unsigned frames_sent;
};
static int sbc_get_presets(struct audio_preset *preset, size_t *len);
};
static int sbc_get_presets(struct audio_preset *preset, size_t *len);
static int sbc_cleanup(void *codec_data);
static int sbc_get_config(void *codec_data,
struct audio_input_config *config);
static int sbc_cleanup(void *codec_data);
static int sbc_get_config(void *codec_data,
struct audio_input_config *config);
+static void sbc_resume(void *codec_data);
struct audio_codec {
uint8_t type;
struct audio_codec {
uint8_t type;
int (*cleanup) (void *codec_data);
int (*get_config) (void *codec_data,
struct audio_input_config *config);
int (*cleanup) (void *codec_data);
int (*get_config) (void *codec_data,
struct audio_input_config *config);
+ void (*resume) (void *codec_data);
ssize_t (*write_data) (void *codec_data, const void *buffer,
size_t bytes);
};
ssize_t (*write_data) (void *codec_data, const void *buffer,
size_t bytes);
};
.init = sbc_codec_init,
.cleanup = sbc_cleanup,
.get_config = sbc_get_config,
.init = sbc_codec_init,
.cleanup = sbc_cleanup,
.get_config = sbc_get_config,
return AUDIO_STATUS_SUCCESS;
}
return AUDIO_STATUS_SUCCESS;
}
+static void sbc_resume(void *codec_data)
+{
+ struct sbc_data *sbc_data = (struct sbc_data *) codec_data;
+
+ DBG("");
+
+ clock_gettime(CLOCK_MONOTONIC, &sbc_data->start);
+
+ sbc_data->frames_sent = 0;
+}
+
static void audio_ipc_cleanup(void)
{
if (audio_sk >= 0) {
static void audio_ipc_cleanup(void)
{
if (audio_sk >= 0) {
if (ipc_resume_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
return -1;
if (ipc_resume_stream_cmd(out->ep->id) != AUDIO_STATUS_SUCCESS)
return -1;
+ out->ep->codec->resume(out->ep->codec_data);
+
out->audio_state = AUDIO_A2DP_STATE_STARTED;
}
out->audio_state = AUDIO_A2DP_STATE_STARTED;
}