Loading Documentation/sound/designs/compress-offload.rst +6 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,11 @@ partial drain EOF is reached and now DSP can start skipping padding delay. Also next write data would belong to next track - set_next_track_param This routine is called to send to DSP codec specific data of subsequent track in gapless before first write. Sequence flow for gapless would be: - Open - Get caps / codec caps Loading @@ -194,6 +199,7 @@ Sequence flow for gapless would be: - Indicate next track data by sending set_next_track - Set metadata of the next track - then call partial_drain to flush most of buffer in DSP - set codec specific data of subsequent track - Fill data of the next track - DSP switches to second track Loading include/sound/compress_driver.h +4 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,8 @@ struct snd_compr_stream { * @get_params: retrieve the codec parameters, mandatory * @set_metadata: Set the metadata values for a stream * @get_metadata: retrieves the requested metadata values from stream * @set_next_track_param: send codec specific data of subsequent track * in gapless * @trigger: Trigger operations like start, pause, resume, drain, stop. * This callback is mandatory * @pointer: Retrieve current h/w pointer information. Mandatory Loading @@ -105,6 +107,8 @@ struct snd_compr_ops { struct snd_compr_metadata *metadata); int (*get_metadata)(struct snd_compr_stream *stream, struct snd_compr_metadata *metadata); int (*set_next_track_param)(struct snd_compr_stream *stream, union snd_codec_options *codec_options); int (*trigger)(struct snd_compr_stream *stream, int cmd); int (*pointer)(struct snd_compr_stream *stream, struct snd_compr_tstamp *tstamp); Loading include/uapi/sound/compress_offload.h +4 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,8 @@ struct snd_compr_metadata { * SNDRV_COMPRESS_STOP: stop a running stream, discarding ring buffer content * and the buffers currently with DSP * SNDRV_COMPRESS_DRAIN: Play till end of buffers and stop after that * SNDRV_COMPRESS_SET_NEXT_TRACK_PARAM: send codec specific data for the next * track in gapless * SNDRV_COMPRESS_IOCTL_VERSION: Query the API version */ #define SNDRV_COMPRESS_IOCTL_VERSION _IOR('C', 0x00, int) Loading @@ -181,6 +183,8 @@ struct snd_compr_metadata { #define SNDRV_COMPRESS_DRAIN _IO('C', 0x34) #define SNDRV_COMPRESS_NEXT_TRACK _IO('C', 0x35) #define SNDRV_COMPRESS_PARTIAL_DRAIN _IO('C', 0x36) #define SNDRV_COMPRESS_SET_NEXT_TRACK_PARAM\ _IOW('C', 0x80, union snd_codec_options) /* * TODO * 1. add mmap support Loading sound/core/compress_offload.c +23 −0 Original line number Diff line number Diff line Loading @@ -832,6 +832,25 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream) return retval; } static int snd_compr_set_next_track_param(struct snd_compr_stream *stream, unsigned long arg) { union snd_codec_options codec_options; int retval; /* set next track params when stream is running or has been setup */ if (stream->runtime->state != SNDRV_PCM_STATE_SETUP && stream->runtime->state != SNDRV_PCM_STATE_RUNNING) return -EPERM; if (copy_from_user(&codec_options, (void __user *)arg, sizeof(codec_options))) return -EFAULT; retval = stream->ops->set_next_track_param(stream, &codec_options); return retval; } static int snd_compress_simple_ioctls(struct file *file, struct snd_compr_stream *stream, unsigned int cmd, unsigned long arg) Loading Loading @@ -923,6 +942,10 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) retval = snd_compr_next_track(stream); break; case _IOC_NR(SNDRV_COMPRESS_SET_NEXT_TRACK_PARAM): retval = snd_compr_set_next_track_param(stream, arg); break; default: mutex_unlock(&stream->device->lock); return snd_compress_simple_ioctls(f, stream, cmd, arg); Loading sound/soc/soc-compress.c +24 −0 Original line number Diff line number Diff line Loading @@ -774,6 +774,28 @@ static int soc_compr_copy(struct snd_compr_stream *cstream, return ret; } static int sst_compr_set_next_track_param(struct snd_compr_stream *cstream, union snd_codec_options *codec_options) { struct snd_soc_pcm_runtime *rtd = cstream->private_data; struct snd_soc_component *component; struct snd_soc_rtdcom_list *rtdcom; int ret = 0; for_each_rtdcom(rtd, rtdcom) { component = rtdcom->component; if (component->driver->compr_ops && component->driver->compr_ops->set_next_track_param) ret = component->driver->compr_ops->set_next_track_param( cstream, codec_options); } return ret; } static int soc_compr_set_metadata(struct snd_compr_stream *cstream, struct snd_compr_metadata *metadata) { Loading Loading @@ -840,6 +862,7 @@ static struct snd_compr_ops soc_compr_ops = { .free = soc_compr_free, .set_params = soc_compr_set_params, .set_metadata = soc_compr_set_metadata, .set_next_track_param = sst_compr_set_next_track_param, .get_metadata = soc_compr_get_metadata, .get_params = soc_compr_get_params, .trigger = soc_compr_trigger, Loading @@ -856,6 +879,7 @@ static struct snd_compr_ops soc_compr_dyn_ops = { .set_params = soc_compr_set_params_fe, .get_params = soc_compr_get_params, .set_metadata = soc_compr_set_metadata, .set_next_track_param = sst_compr_set_next_track_param, .get_metadata = soc_compr_get_metadata, .trigger = soc_compr_trigger_fe, .pointer = soc_compr_pointer, Loading Loading
Documentation/sound/designs/compress-offload.rst +6 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,11 @@ partial drain EOF is reached and now DSP can start skipping padding delay. Also next write data would belong to next track - set_next_track_param This routine is called to send to DSP codec specific data of subsequent track in gapless before first write. Sequence flow for gapless would be: - Open - Get caps / codec caps Loading @@ -194,6 +199,7 @@ Sequence flow for gapless would be: - Indicate next track data by sending set_next_track - Set metadata of the next track - then call partial_drain to flush most of buffer in DSP - set codec specific data of subsequent track - Fill data of the next track - DSP switches to second track Loading
include/sound/compress_driver.h +4 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,8 @@ struct snd_compr_stream { * @get_params: retrieve the codec parameters, mandatory * @set_metadata: Set the metadata values for a stream * @get_metadata: retrieves the requested metadata values from stream * @set_next_track_param: send codec specific data of subsequent track * in gapless * @trigger: Trigger operations like start, pause, resume, drain, stop. * This callback is mandatory * @pointer: Retrieve current h/w pointer information. Mandatory Loading @@ -105,6 +107,8 @@ struct snd_compr_ops { struct snd_compr_metadata *metadata); int (*get_metadata)(struct snd_compr_stream *stream, struct snd_compr_metadata *metadata); int (*set_next_track_param)(struct snd_compr_stream *stream, union snd_codec_options *codec_options); int (*trigger)(struct snd_compr_stream *stream, int cmd); int (*pointer)(struct snd_compr_stream *stream, struct snd_compr_tstamp *tstamp); Loading
include/uapi/sound/compress_offload.h +4 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,8 @@ struct snd_compr_metadata { * SNDRV_COMPRESS_STOP: stop a running stream, discarding ring buffer content * and the buffers currently with DSP * SNDRV_COMPRESS_DRAIN: Play till end of buffers and stop after that * SNDRV_COMPRESS_SET_NEXT_TRACK_PARAM: send codec specific data for the next * track in gapless * SNDRV_COMPRESS_IOCTL_VERSION: Query the API version */ #define SNDRV_COMPRESS_IOCTL_VERSION _IOR('C', 0x00, int) Loading @@ -181,6 +183,8 @@ struct snd_compr_metadata { #define SNDRV_COMPRESS_DRAIN _IO('C', 0x34) #define SNDRV_COMPRESS_NEXT_TRACK _IO('C', 0x35) #define SNDRV_COMPRESS_PARTIAL_DRAIN _IO('C', 0x36) #define SNDRV_COMPRESS_SET_NEXT_TRACK_PARAM\ _IOW('C', 0x80, union snd_codec_options) /* * TODO * 1. add mmap support Loading
sound/core/compress_offload.c +23 −0 Original line number Diff line number Diff line Loading @@ -832,6 +832,25 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream) return retval; } static int snd_compr_set_next_track_param(struct snd_compr_stream *stream, unsigned long arg) { union snd_codec_options codec_options; int retval; /* set next track params when stream is running or has been setup */ if (stream->runtime->state != SNDRV_PCM_STATE_SETUP && stream->runtime->state != SNDRV_PCM_STATE_RUNNING) return -EPERM; if (copy_from_user(&codec_options, (void __user *)arg, sizeof(codec_options))) return -EFAULT; retval = stream->ops->set_next_track_param(stream, &codec_options); return retval; } static int snd_compress_simple_ioctls(struct file *file, struct snd_compr_stream *stream, unsigned int cmd, unsigned long arg) Loading Loading @@ -923,6 +942,10 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) retval = snd_compr_next_track(stream); break; case _IOC_NR(SNDRV_COMPRESS_SET_NEXT_TRACK_PARAM): retval = snd_compr_set_next_track_param(stream, arg); break; default: mutex_unlock(&stream->device->lock); return snd_compress_simple_ioctls(f, stream, cmd, arg); Loading
sound/soc/soc-compress.c +24 −0 Original line number Diff line number Diff line Loading @@ -774,6 +774,28 @@ static int soc_compr_copy(struct snd_compr_stream *cstream, return ret; } static int sst_compr_set_next_track_param(struct snd_compr_stream *cstream, union snd_codec_options *codec_options) { struct snd_soc_pcm_runtime *rtd = cstream->private_data; struct snd_soc_component *component; struct snd_soc_rtdcom_list *rtdcom; int ret = 0; for_each_rtdcom(rtd, rtdcom) { component = rtdcom->component; if (component->driver->compr_ops && component->driver->compr_ops->set_next_track_param) ret = component->driver->compr_ops->set_next_track_param( cstream, codec_options); } return ret; } static int soc_compr_set_metadata(struct snd_compr_stream *cstream, struct snd_compr_metadata *metadata) { Loading Loading @@ -840,6 +862,7 @@ static struct snd_compr_ops soc_compr_ops = { .free = soc_compr_free, .set_params = soc_compr_set_params, .set_metadata = soc_compr_set_metadata, .set_next_track_param = sst_compr_set_next_track_param, .get_metadata = soc_compr_get_metadata, .get_params = soc_compr_get_params, .trigger = soc_compr_trigger, Loading @@ -856,6 +879,7 @@ static struct snd_compr_ops soc_compr_dyn_ops = { .set_params = soc_compr_set_params_fe, .get_params = soc_compr_get_params, .set_metadata = soc_compr_set_metadata, .set_next_track_param = sst_compr_set_next_track_param, .get_metadata = soc_compr_get_metadata, .trigger = soc_compr_trigger_fe, .pointer = soc_compr_pointer, Loading