Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
05288426
Commit
05288426
authored
Sep 11, 2012
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linus' into for-next
To merge HD-audio fixes back to 3.7 development line
parents
b35aabd7
c302d613
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
78 additions
and
36 deletions
+78
-36
sound/core/compress_offload.c
sound/core/compress_offload.c
+3
-5
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+1
-1
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+1
-0
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+1
-1
sound/usb/card.c
sound/usb/card.c
+2
-2
sound/usb/endpoint.c
sound/usb/endpoint.c
+10
-14
sound/usb/endpoint.h
sound/usb/endpoint.h
+2
-1
sound/usb/pcm.c
sound/usb/pcm.c
+58
-12
No files found.
sound/core/compress_offload.c
View file @
05288426
...
@@ -80,14 +80,12 @@ static int snd_compr_open(struct inode *inode, struct file *f)
...
@@ -80,14 +80,12 @@ static int snd_compr_open(struct inode *inode, struct file *f)
int
maj
=
imajor
(
inode
);
int
maj
=
imajor
(
inode
);
int
ret
;
int
ret
;
if
(
f
->
f_flags
&
O_WRONLY
)
if
(
(
f
->
f_flags
&
O_ACCMODE
)
==
O_WRONLY
)
dirn
=
SND_COMPRESS_PLAYBACK
;
dirn
=
SND_COMPRESS_PLAYBACK
;
else
if
(
f
->
f_flags
&
O_RDONLY
)
else
if
(
(
f
->
f_flags
&
O_ACCMODE
)
==
O_RDONLY
)
dirn
=
SND_COMPRESS_CAPTURE
;
dirn
=
SND_COMPRESS_CAPTURE
;
else
{
else
pr_err
(
"invalid direction
\n
"
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
(
maj
==
snd_major
)
if
(
maj
==
snd_major
)
compr
=
snd_lookup_minor_data
(
iminor
(
inode
),
compr
=
snd_lookup_minor_data
(
iminor
(
inode
),
...
...
sound/pci/hda/hda_codec.c
View file @
05288426
...
@@ -2368,6 +2368,7 @@ int snd_hda_codec_reset(struct hda_codec *codec)
...
@@ -2368,6 +2368,7 @@ int snd_hda_codec_reset(struct hda_codec *codec)
}
}
if
(
codec
->
patch_ops
.
free
)
if
(
codec
->
patch_ops
.
free
)
codec
->
patch_ops
.
free
(
codec
);
codec
->
patch_ops
.
free
(
codec
);
memset
(
&
codec
->
patch_ops
,
0
,
sizeof
(
codec
->
patch_ops
));
snd_hda_jack_tbl_clear
(
codec
);
snd_hda_jack_tbl_clear
(
codec
);
codec
->
proc_widget_hook
=
NULL
;
codec
->
proc_widget_hook
=
NULL
;
codec
->
spec
=
NULL
;
codec
->
spec
=
NULL
;
...
@@ -2383,7 +2384,6 @@ int snd_hda_codec_reset(struct hda_codec *codec)
...
@@ -2383,7 +2384,6 @@ int snd_hda_codec_reset(struct hda_codec *codec)
codec
->
num_pcms
=
0
;
codec
->
num_pcms
=
0
;
codec
->
pcm_info
=
NULL
;
codec
->
pcm_info
=
NULL
;
codec
->
preset
=
NULL
;
codec
->
preset
=
NULL
;
memset
(
&
codec
->
patch_ops
,
0
,
sizeof
(
codec
->
patch_ops
));
codec
->
slave_dig_outs
=
NULL
;
codec
->
slave_dig_outs
=
NULL
;
codec
->
spdif_status_reset
=
0
;
codec
->
spdif_status_reset
=
0
;
module_put
(
codec
->
owner
);
module_put
(
codec
->
owner
);
...
...
sound/pci/hda/hda_intel.c
View file @
05288426
...
@@ -2796,6 +2796,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
...
@@ -2796,6 +2796,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
SND_PCI_QUIRK
(
0x1043
,
0x813d
,
"ASUS P5AD2"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x813d
,
"ASUS P5AD2"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x81b3
,
"ASUS"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x81b3
,
"ASUS"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x81e7
,
"ASUS M2V"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x81e7
,
"ASUS M2V"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1043
,
0x1b43
,
"ASUS K53E"
,
POS_FIX_POSBUF
),
SND_PCI_QUIRK
(
0x104d
,
0x9069
,
"Sony VPCS11V9E"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x104d
,
0x9069
,
"Sony VPCS11V9E"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x10de
,
0xcb89
,
"Macbook Pro 7,1"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x10de
,
0xcb89
,
"Macbook Pro 7,1"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1297
,
0x3166
,
"Shuttle"
,
POS_FIX_LPIB
),
SND_PCI_QUIRK
(
0x1297
,
0x3166
,
"Shuttle"
,
POS_FIX_LPIB
),
...
...
sound/pci/hda/patch_sigmatel.c
View file @
05288426
...
@@ -1075,7 +1075,7 @@ static struct snd_kcontrol_new stac_smux_mixer = {
...
@@ -1075,7 +1075,7 @@ static struct snd_kcontrol_new stac_smux_mixer = {
static
const
char
*
const
slave_pfxs
[]
=
{
static
const
char
*
const
slave_pfxs
[]
=
{
"Front"
,
"Surround"
,
"Center"
,
"LFE"
,
"Side"
,
"Front"
,
"Surround"
,
"Center"
,
"LFE"
,
"Side"
,
"Headphone"
,
"Speaker"
,
"IEC958"
,
"Headphone"
,
"Speaker"
,
"IEC958"
,
"PCM"
,
NULL
NULL
};
};
...
...
sound/usb/card.c
View file @
05288426
...
@@ -553,7 +553,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
...
@@ -553,7 +553,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
struct
snd_usb_audio
*
chip
)
struct
snd_usb_audio
*
chip
)
{
{
struct
snd_card
*
card
;
struct
snd_card
*
card
;
struct
list_head
*
p
;
struct
list_head
*
p
,
*
n
;
if
(
chip
==
(
void
*
)
-
1L
)
if
(
chip
==
(
void
*
)
-
1L
)
return
;
return
;
...
@@ -570,7 +570,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
...
@@ -570,7 +570,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
snd_usb_stream_disconnect
(
p
);
snd_usb_stream_disconnect
(
p
);
}
}
/* release the endpoint resources */
/* release the endpoint resources */
list_for_each
(
p
,
&
chip
->
ep_list
)
{
list_for_each
_safe
(
p
,
n
,
&
chip
->
ep_list
)
{
snd_usb_endpoint_free
(
p
);
snd_usb_endpoint_free
(
p
);
}
}
/* release the midi resources */
/* release the midi resources */
...
...
sound/usb/endpoint.c
View file @
05288426
...
@@ -142,7 +142,7 @@ int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep)
...
@@ -142,7 +142,7 @@ int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep)
*
*
* For implicit feedback, next_packet_size() is unused.
* For implicit feedback, next_packet_size() is unused.
*/
*/
static
int
next_packet_size
(
struct
snd_usb_endpoint
*
ep
)
int
snd_usb_endpoint_
next_packet_size
(
struct
snd_usb_endpoint
*
ep
)
{
{
unsigned
long
flags
;
unsigned
long
flags
;
int
ret
;
int
ret
;
...
@@ -183,15 +183,6 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep,
...
@@ -183,15 +183,6 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep,
ep
->
retire_data_urb
(
ep
->
data_subs
,
urb
);
ep
->
retire_data_urb
(
ep
->
data_subs
,
urb
);
}
}
static
void
prepare_outbound_urb_sizes
(
struct
snd_usb_endpoint
*
ep
,
struct
snd_urb_ctx
*
ctx
)
{
int
i
;
for
(
i
=
0
;
i
<
ctx
->
packets
;
++
i
)
ctx
->
packet_size
[
i
]
=
next_packet_size
(
ep
);
}
/*
/*
* Prepare a PLAYBACK urb for submission to the bus.
* Prepare a PLAYBACK urb for submission to the bus.
*/
*/
...
@@ -376,7 +367,6 @@ static void snd_complete_urb(struct urb *urb)
...
@@ -376,7 +367,6 @@ static void snd_complete_urb(struct urb *urb)
goto
exit_clear
;
goto
exit_clear
;
}
}
prepare_outbound_urb_sizes
(
ep
,
ctx
);
prepare_outbound_urb
(
ep
,
ctx
);
prepare_outbound_urb
(
ep
,
ctx
);
}
else
{
}
else
{
retire_inbound_urb
(
ep
,
ctx
);
retire_inbound_urb
(
ep
,
ctx
);
...
@@ -806,6 +796,8 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
...
@@ -806,6 +796,8 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
* snd_usb_endpoint_start: start an snd_usb_endpoint
* snd_usb_endpoint_start: start an snd_usb_endpoint
*
*
* @ep: the endpoint to start
* @ep: the endpoint to start
* @can_sleep: flag indicating whether the operation is executed in
* non-atomic context
*
*
* A call to this function will increment the use count of the endpoint.
* A call to this function will increment the use count of the endpoint.
* In case it is not already running, the URBs for this endpoint will be
* In case it is not already running, the URBs for this endpoint will be
...
@@ -815,7 +807,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
...
@@ -815,7 +807,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
*
*
* Returns an error if the URB submission failed, 0 in all other cases.
* Returns an error if the URB submission failed, 0 in all other cases.
*/
*/
int
snd_usb_endpoint_start
(
struct
snd_usb_endpoint
*
ep
)
int
snd_usb_endpoint_start
(
struct
snd_usb_endpoint
*
ep
,
int
can_sleep
)
{
{
int
err
;
int
err
;
unsigned
int
i
;
unsigned
int
i
;
...
@@ -827,6 +819,11 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
...
@@ -827,6 +819,11 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
if
(
++
ep
->
use_count
!=
1
)
if
(
++
ep
->
use_count
!=
1
)
return
0
;
return
0
;
/* just to be sure */
deactivate_urbs
(
ep
,
0
,
can_sleep
);
if
(
can_sleep
)
wait_clear_urbs
(
ep
);
ep
->
active_mask
=
0
;
ep
->
active_mask
=
0
;
ep
->
unlink_mask
=
0
;
ep
->
unlink_mask
=
0
;
ep
->
phase
=
0
;
ep
->
phase
=
0
;
...
@@ -858,7 +855,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
...
@@ -858,7 +855,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
goto
__error
;
goto
__error
;
if
(
usb_pipeout
(
ep
->
pipe
))
{
if
(
usb_pipeout
(
ep
->
pipe
))
{
prepare_outbound_urb_sizes
(
ep
,
urb
->
context
);
prepare_outbound_urb
(
ep
,
urb
->
context
);
prepare_outbound_urb
(
ep
,
urb
->
context
);
}
else
{
}
else
{
prepare_inbound_urb
(
ep
,
urb
->
context
);
prepare_inbound_urb
(
ep
,
urb
->
context
);
...
...
sound/usb/endpoint.h
View file @
05288426
...
@@ -13,7 +13,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
...
@@ -13,7 +13,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
struct
audioformat
*
fmt
,
struct
audioformat
*
fmt
,
struct
snd_usb_endpoint
*
sync_ep
);
struct
snd_usb_endpoint
*
sync_ep
);
int
snd_usb_endpoint_start
(
struct
snd_usb_endpoint
*
ep
);
int
snd_usb_endpoint_start
(
struct
snd_usb_endpoint
*
ep
,
int
can_sleep
);
void
snd_usb_endpoint_stop
(
struct
snd_usb_endpoint
*
ep
,
void
snd_usb_endpoint_stop
(
struct
snd_usb_endpoint
*
ep
,
int
force
,
int
can_sleep
,
int
wait
);
int
force
,
int
can_sleep
,
int
wait
);
int
snd_usb_endpoint_activate
(
struct
snd_usb_endpoint
*
ep
);
int
snd_usb_endpoint_activate
(
struct
snd_usb_endpoint
*
ep
);
...
@@ -21,6 +21,7 @@ int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep);
...
@@ -21,6 +21,7 @@ int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep);
void
snd_usb_endpoint_free
(
struct
list_head
*
head
);
void
snd_usb_endpoint_free
(
struct
list_head
*
head
);
int
snd_usb_endpoint_implict_feedback_sink
(
struct
snd_usb_endpoint
*
ep
);
int
snd_usb_endpoint_implict_feedback_sink
(
struct
snd_usb_endpoint
*
ep
);
int
snd_usb_endpoint_next_packet_size
(
struct
snd_usb_endpoint
*
ep
);
void
snd_usb_handle_sync_urb
(
struct
snd_usb_endpoint
*
ep
,
void
snd_usb_handle_sync_urb
(
struct
snd_usb_endpoint
*
ep
,
struct
snd_usb_endpoint
*
sender
,
struct
snd_usb_endpoint
*
sender
,
...
...
sound/usb/pcm.c
View file @
05288426
...
@@ -212,7 +212,7 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface,
...
@@ -212,7 +212,7 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface,
}
}
}
}
static
int
start_endpoints
(
struct
snd_usb_substream
*
subs
)
static
int
start_endpoints
(
struct
snd_usb_substream
*
subs
,
int
can_sleep
)
{
{
int
err
;
int
err
;
...
@@ -225,7 +225,7 @@ static int start_endpoints(struct snd_usb_substream *subs)
...
@@ -225,7 +225,7 @@ static int start_endpoints(struct snd_usb_substream *subs)
snd_printdd
(
KERN_DEBUG
"Starting data EP @%p
\n
"
,
ep
);
snd_printdd
(
KERN_DEBUG
"Starting data EP @%p
\n
"
,
ep
);
ep
->
data_subs
=
subs
;
ep
->
data_subs
=
subs
;
err
=
snd_usb_endpoint_start
(
ep
);
err
=
snd_usb_endpoint_start
(
ep
,
can_sleep
);
if
(
err
<
0
)
{
if
(
err
<
0
)
{
clear_bit
(
SUBSTREAM_FLAG_DATA_EP_STARTED
,
&
subs
->
flags
);
clear_bit
(
SUBSTREAM_FLAG_DATA_EP_STARTED
,
&
subs
->
flags
);
return
err
;
return
err
;
...
@@ -236,10 +236,25 @@ static int start_endpoints(struct snd_usb_substream *subs)
...
@@ -236,10 +236,25 @@ static int start_endpoints(struct snd_usb_substream *subs)
!
test_and_set_bit
(
SUBSTREAM_FLAG_SYNC_EP_STARTED
,
&
subs
->
flags
))
{
!
test_and_set_bit
(
SUBSTREAM_FLAG_SYNC_EP_STARTED
,
&
subs
->
flags
))
{
struct
snd_usb_endpoint
*
ep
=
subs
->
sync_endpoint
;
struct
snd_usb_endpoint
*
ep
=
subs
->
sync_endpoint
;
if
(
subs
->
data_endpoint
->
iface
!=
subs
->
sync_endpoint
->
iface
||
subs
->
data_endpoint
->
alt_idx
!=
subs
->
sync_endpoint
->
alt_idx
)
{
err
=
usb_set_interface
(
subs
->
dev
,
subs
->
sync_endpoint
->
iface
,
subs
->
sync_endpoint
->
alt_idx
);
if
(
err
<
0
)
{
snd_printk
(
KERN_ERR
"%d:%d:%d: cannot set interface (%d)
\n
"
,
subs
->
dev
->
devnum
,
subs
->
sync_endpoint
->
iface
,
subs
->
sync_endpoint
->
alt_idx
,
err
);
return
-
EIO
;
}
}
snd_printdd
(
KERN_DEBUG
"Starting sync EP @%p
\n
"
,
ep
);
snd_printdd
(
KERN_DEBUG
"Starting sync EP @%p
\n
"
,
ep
);
ep
->
sync_slave
=
subs
->
data_endpoint
;
ep
->
sync_slave
=
subs
->
data_endpoint
;
err
=
snd_usb_endpoint_start
(
ep
);
err
=
snd_usb_endpoint_start
(
ep
,
can_sleep
);
if
(
err
<
0
)
{
if
(
err
<
0
)
{
clear_bit
(
SUBSTREAM_FLAG_SYNC_EP_STARTED
,
&
subs
->
flags
);
clear_bit
(
SUBSTREAM_FLAG_SYNC_EP_STARTED
,
&
subs
->
flags
);
return
err
;
return
err
;
...
@@ -544,13 +559,10 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
...
@@ -544,13 +559,10 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
subs
->
last_frame_number
=
0
;
subs
->
last_frame_number
=
0
;
runtime
->
delay
=
0
;
runtime
->
delay
=
0
;
/* clear the pending deactivation on the target EPs */
deactivate_endpoints
(
subs
);
/* for playback, submit the URBs now; otherwise, the first hwptr_done
/* for playback, submit the URBs now; otherwise, the first hwptr_done
* updates for all URBs would happen at the same time when starting */
* updates for all URBs would happen at the same time when starting */
if
(
subs
->
direction
==
SNDRV_PCM_STREAM_PLAYBACK
)
if
(
subs
->
direction
==
SNDRV_PCM_STREAM_PLAYBACK
)
return
start_endpoints
(
subs
);
return
start_endpoints
(
subs
,
1
);
return
0
;
return
0
;
}
}
...
@@ -1032,6 +1044,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
...
@@ -1032,6 +1044,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
struct
urb
*
urb
)
struct
urb
*
urb
)
{
{
struct
snd_pcm_runtime
*
runtime
=
subs
->
pcm_substream
->
runtime
;
struct
snd_pcm_runtime
*
runtime
=
subs
->
pcm_substream
->
runtime
;
struct
snd_usb_endpoint
*
ep
=
subs
->
data_endpoint
;
struct
snd_urb_ctx
*
ctx
=
urb
->
context
;
struct
snd_urb_ctx
*
ctx
=
urb
->
context
;
unsigned
int
counts
,
frames
,
bytes
;
unsigned
int
counts
,
frames
,
bytes
;
int
i
,
stride
,
period_elapsed
=
0
;
int
i
,
stride
,
period_elapsed
=
0
;
...
@@ -1043,7 +1056,11 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
...
@@ -1043,7 +1056,11 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
urb
->
number_of_packets
=
0
;
urb
->
number_of_packets
=
0
;
spin_lock_irqsave
(
&
subs
->
lock
,
flags
);
spin_lock_irqsave
(
&
subs
->
lock
,
flags
);
for
(
i
=
0
;
i
<
ctx
->
packets
;
i
++
)
{
for
(
i
=
0
;
i
<
ctx
->
packets
;
i
++
)
{
if
(
ctx
->
packet_size
[
i
])
counts
=
ctx
->
packet_size
[
i
];
counts
=
ctx
->
packet_size
[
i
];
else
counts
=
snd_usb_endpoint_next_packet_size
(
ep
);
/* set up descriptor */
/* set up descriptor */
urb
->
iso_frame_desc
[
i
].
offset
=
frames
*
stride
;
urb
->
iso_frame_desc
[
i
].
offset
=
frames
*
stride
;
urb
->
iso_frame_desc
[
i
].
length
=
counts
*
stride
;
urb
->
iso_frame_desc
[
i
].
length
=
counts
*
stride
;
...
@@ -1094,7 +1111,16 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
...
@@ -1094,7 +1111,16 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
subs
->
hwptr_done
+=
bytes
;
subs
->
hwptr_done
+=
bytes
;
if
(
subs
->
hwptr_done
>=
runtime
->
buffer_size
*
stride
)
if
(
subs
->
hwptr_done
>=
runtime
->
buffer_size
*
stride
)
subs
->
hwptr_done
-=
runtime
->
buffer_size
*
stride
;
subs
->
hwptr_done
-=
runtime
->
buffer_size
*
stride
;
/* update delay with exact number of samples queued */
runtime
->
delay
=
subs
->
last_delay
;
runtime
->
delay
+=
frames
;
runtime
->
delay
+=
frames
;
subs
->
last_delay
=
runtime
->
delay
;
/* realign last_frame_number */
subs
->
last_frame_number
=
usb_get_current_frame_number
(
subs
->
dev
);
subs
->
last_frame_number
&=
0xFF
;
/* keep 8 LSBs */
spin_unlock_irqrestore
(
&
subs
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
subs
->
lock
,
flags
);
urb
->
transfer_buffer_length
=
bytes
;
urb
->
transfer_buffer_length
=
bytes
;
if
(
period_elapsed
)
if
(
period_elapsed
)
...
@@ -1112,12 +1138,32 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
...
@@ -1112,12 +1138,32 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
struct
snd_pcm_runtime
*
runtime
=
subs
->
pcm_substream
->
runtime
;
struct
snd_pcm_runtime
*
runtime
=
subs
->
pcm_substream
->
runtime
;
int
stride
=
runtime
->
frame_bits
>>
3
;
int
stride
=
runtime
->
frame_bits
>>
3
;
int
processed
=
urb
->
transfer_buffer_length
/
stride
;
int
processed
=
urb
->
transfer_buffer_length
/
stride
;
int
est_delay
;
/* ignore the delay accounting when procssed=0 is given, i.e.
* silent payloads are procssed before handling the actual data
*/
if
(
!
processed
)
return
;
spin_lock_irqsave
(
&
subs
->
lock
,
flags
);
spin_lock_irqsave
(
&
subs
->
lock
,
flags
);
if
(
processed
>
runtime
->
delay
)
est_delay
=
snd_usb_pcm_delay
(
subs
,
runtime
->
rate
);
runtime
->
delay
=
0
;
/* update delay with exact number of samples played */
if
(
processed
>
subs
->
last_delay
)
subs
->
last_delay
=
0
;
else
else
runtime
->
delay
-=
processed
;
subs
->
last_delay
-=
processed
;
runtime
->
delay
=
subs
->
last_delay
;
/*
* Report when delay estimate is off by more than 2ms.
* The error should be lower than 2ms since the estimate relies
* on two reads of a counter updated every ms.
*/
if
(
abs
(
est_delay
-
subs
->
last_delay
)
*
1000
>
runtime
->
rate
*
2
)
snd_printk
(
KERN_DEBUG
"delay: estimated %d, actual %d
\n
"
,
est_delay
,
subs
->
last_delay
);
spin_unlock_irqrestore
(
&
subs
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
subs
->
lock
,
flags
);
}
}
...
@@ -1175,7 +1221,7 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream
...
@@ -1175,7 +1221,7 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream
switch
(
cmd
)
{
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_START
:
err
=
start_endpoints
(
subs
);
err
=
start_endpoints
(
subs
,
0
);
if
(
err
<
0
)
if
(
err
<
0
)
return
err
;
return
err
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment