diff mbox

[v3,kernel,2/3] Extend snd_pcm_ops and snd_pcm_runtime

Message ID 1423239388-17745-2-git-send-email-timcussins@eml.cc (mailing list archive)
State New, archived
Headers show

Commit Message

Tim Cussins Feb. 6, 2015, 4:16 p.m. UTC
snd_pcm_ops picks up methods for:

- start_at
- start_at_abort
- start_at_gettime

For startat requests involving audio hardware clocks, ALSA core
delegates to the driver using these methods, should they exist.

snd_pcm_runtime gains fields that contain the current state of
the startat timer, if any. This allows cancellation and querying.

Signed-off-by: Tim Cussins <timcussins@eml.cc>

Comments

Pierre-Louis Bossart Feb. 6, 2015, 4:38 p.m. UTC | #1
On 02/06/2015 10:16 AM, Tim Cussins wrote:
> snd_pcm_ops picks up methods for:
> 
> - start_at
> - start_at_abort
> - start_at_gettime
> 
> For startat requests involving audio hardware clocks, ALSA core
> delegates to the driver using these methods, should they exist.
> 
> snd_pcm_runtime gains fields that contain the current state of
> the startat timer, if any. This allows cancellation and querying.
> 
> Signed-off-by: Tim Cussins <timcussins@eml.cc>
> 
> diff --git a/include/sound/pcm.h b/include/sound/pcm.h
> index 07299b2..a414fec 100644
> --- a/include/sound/pcm.h
> +++ b/include/sound/pcm.h
> @@ -73,6 +73,9 @@ struct snd_pcm_ops {
>  	snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
>  	int (*wall_clock)(struct snd_pcm_substream *substream,
>  			  struct timespec *audio_ts);
> +	int (*start_at)(struct snd_pcm_substream *substream, int startat_clock_type, const struct timespec *ts);
> +	int (*start_at_abort)(struct snd_pcm_substream *substream);
> +	int (*start_at_gettime)(struct snd_pcm_substream *substream, int startat_clock_type, struct timespec *current_time);

What is the purpose of this _gettime? If the app relies on regular system time then it doesn't need to use this and if it relies on the link then doesn't this routine duplicate the audio timestamp stuff i am still working on.

>  	int (*copy)(struct snd_pcm_substream *substream, int channel,
>  		    snd_pcm_uframes_t pos,
>  		    void __user *buf, snd_pcm_uframes_t count);
> @@ -368,6 +371,12 @@ struct snd_pcm_ runtime {
>  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
>  	struct snd_pcm_hwptr_log *hwptr_log;
>  #endif
> +
> +	bool startat_timer_running;
> +	/* The following values are valid if startat_timer_running == true */
> +	int startat_clock_type;			/* startat clock type of current timer */
> +	struct timespec startat_start_time;	/* start time of current timer */
> +	void* startat_timer_data;		/* data associated with current timer */
>  };
>  
>  struct snd_pcm_group {		/* keep linked substreams */
>
Tim Cussins Feb. 6, 2015, 5:25 p.m. UTC | #2
Hi,

On 06/02/15 16:38, Pierre-Louis Bossart wrote:
> On 02/06/2015 10:16 AM, Tim Cussins wrote:
>> snd_pcm_ops picks up methods for:
>>
>> - start_at - start_at_abort - start_at_gettime
>>
>> For startat requests involving audio hardware clocks, ALSA core
>> delegates to the driver using these methods, should they exist.
>>
>> snd_pcm_runtime gains fields that contain the current state of the
>> startat timer, if any. This allows cancellation and querying.
>>
>> Signed-off-by: Tim Cussins <timcussins@eml.cc>
>>
>> diff --git a/include/sound/pcm.h b/include/sound/pcm.h index
>> 07299b2..a414fec 100644 --- a/include/sound/pcm.h +++
>> b/include/sound/pcm.h @@ -73,6 +73,9 @@ struct snd_pcm_ops {
>> snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
>> int (*wall_clock)(struct snd_pcm_substream *substream, struct
>> timespec *audio_ts); +	int (*start_at)(struct snd_pcm_substream
>> *substream, int startat_clock_type, const struct timespec *ts); +
>> int (*start_at_abort)(struct snd_pcm_substream *substream); +	int
>> (*start_at_gettime)(struct snd_pcm_substream *substream, int
>> startat_clock_type, struct timespec *current_time);
>
> What is the purpose of this _gettime? If the app relies on regular
> system time then it doesn't need to use this and if it relies on the
> link then doesn't this routine duplicate the audio timestamp stuff i
> am still working on.

This patch is written to stand on its own, without timestamping 
evolutions. Once your patch is in, this patch would be rebased on your 
work :)

>> int (*copy)(struct snd_pcm_substream *substream, int channel,
>> snd_pcm_uframes_t pos, void __user *buf, snd_pcm_uframes_t count);
>> @@ -368,6 +371,12 @@ struct snd_pcm_ runtime { #ifdef
>> CONFIG_SND_PCM_XRUN_DEBUG struct snd_pcm_hwptr_log *hwptr_log;
>> #endif + +	bool startat_timer_running; +	/* The following values
>> are valid if startat_timer_running == true */ +	int
>> startat_clock_type;			/* startat clock type of current timer */ +
>> struct timespec startat_start_time;	/* start time of current timer
>> */ +	void* startat_timer_data;		/* data associated with current
>> timer */ };
>>
>> struct snd_pcm_group {		/* keep linked substreams */
>>
>
diff mbox

Patch

diff --git a/include/sound/pcm.h b/include/sound/pcm.h
index 07299b2..a414fec 100644
--- a/include/sound/pcm.h
+++ b/include/sound/pcm.h
@@ -73,6 +73,9 @@  struct snd_pcm_ops {
 	snd_pcm_uframes_t (*pointer)(struct snd_pcm_substream *substream);
 	int (*wall_clock)(struct snd_pcm_substream *substream,
 			  struct timespec *audio_ts);
+	int (*start_at)(struct snd_pcm_substream *substream, int startat_clock_type, const struct timespec *ts);
+	int (*start_at_abort)(struct snd_pcm_substream *substream);
+	int (*start_at_gettime)(struct snd_pcm_substream *substream, int startat_clock_type, struct timespec *current_time);
 	int (*copy)(struct snd_pcm_substream *substream, int channel,
 		    snd_pcm_uframes_t pos,
 		    void __user *buf, snd_pcm_uframes_t count);
@@ -368,6 +371,12 @@  struct snd_pcm_runtime {
 #ifdef CONFIG_SND_PCM_XRUN_DEBUG
 	struct snd_pcm_hwptr_log *hwptr_log;
 #endif
+
+	bool startat_timer_running;
+	/* The following values are valid if startat_timer_running == true */
+	int startat_clock_type;			/* startat clock type of current timer */
+	struct timespec startat_start_time;	/* start time of current timer */
+	void* startat_timer_data;		/* data associated with current timer */
 };
 
 struct snd_pcm_group {		/* keep linked substreams */