@@ -75,7 +75,9 @@ static void em28xx_audio_isocirq(struct urb *urb)
75
75
struct em28xx * dev = urb -> context ;
76
76
int i ;
77
77
unsigned int oldptr ;
78
+ #ifdef NO_PCM_LOCK
78
79
unsigned long flags ;
80
+ #endif
79
81
int period_elapsed = 0 ;
80
82
int status ;
81
83
unsigned char * cp ;
@@ -96,9 +98,26 @@ static void em28xx_audio_isocirq(struct urb *urb)
96
98
if (!length )
97
99
continue ;
98
100
101
+ #ifdef NO_PCM_LOCK
99
102
spin_lock_irqsave (& dev -> adev -> slock , flags );
100
-
103
+ #endif
101
104
oldptr = dev -> adev -> hwptr_done_capture ;
105
+ if (oldptr + length >= runtime -> buffer_size ) {
106
+ unsigned int cnt =
107
+ runtime -> buffer_size - oldptr ;
108
+ memcpy (runtime -> dma_area + oldptr * stride , cp ,
109
+ cnt * stride );
110
+ memcpy (runtime -> dma_area , cp + cnt * stride ,
111
+ length * stride - cnt * stride );
112
+ } else {
113
+ memcpy (runtime -> dma_area + oldptr * stride , cp ,
114
+ length * stride );
115
+ }
116
+
117
+ #ifndef NO_PCM_LOCK
118
+ snd_pcm_stream_lock (substream );
119
+ #endif
120
+
102
121
dev -> adev -> hwptr_done_capture += length ;
103
122
if (dev -> adev -> hwptr_done_capture >=
104
123
runtime -> buffer_size )
@@ -113,19 +132,11 @@ static void em28xx_audio_isocirq(struct urb *urb)
113
132
period_elapsed = 1 ;
114
133
}
115
134
135
+ #ifdef NO_PCM_LOCK
116
136
spin_unlock_irqrestore (& dev -> adev -> slock , flags );
117
-
118
- if (oldptr + length >= runtime -> buffer_size ) {
119
- unsigned int cnt =
120
- runtime -> buffer_size - oldptr ;
121
- memcpy (runtime -> dma_area + oldptr * stride , cp ,
122
- cnt * stride );
123
- memcpy (runtime -> dma_area , cp + cnt * stride ,
124
- length * stride - cnt * stride );
125
- } else {
126
- memcpy (runtime -> dma_area + oldptr * stride , cp ,
127
- length * stride );
128
- }
137
+ #else
138
+ snd_pcm_stream_unlock (substream );
139
+ #endif
129
140
}
130
141
if (period_elapsed )
131
142
snd_pcm_period_elapsed (substream );
0 commit comments