int ret;
/* Instruct the cx18 to start sending packets */
+ snd_cx18_lock(cxsc);
s = &cx->streams[CX18_ENC_STREAM_TYPE_PCM];
/* Allocate memory */
item = kmalloc(sizeof(struct cx18_open_id), GFP_KERNEL);
- if (NULL == item)
+ if (NULL == item) {
+ snd_cx18_unlock(cxsc);
return -ENOMEM;
+ }
item->cx = cx;
item->type = s->type;
if (cx18_claim_stream(item, item->type)) {
/* No, it's already in use */
kfree(item);
+ snd_cx18_unlock(cxsc);
return -EBUSY;
}
if (test_bit(CX18_F_S_STREAMOFF, &s->s_flags) ||
test_and_set_bit(CX18_F_S_STREAMING, &s->s_flags)) {
/* We're already streaming. No additional action required */
+ snd_cx18_unlock(cxsc);
return 0;
}
/* Not currently streaming, so start it up */
set_bit(CX18_F_S_STREAMING, &s->s_flags);
ret = cx18_start_v4l2_encode_stream(s);
+ snd_cx18_unlock(cxsc);
return 0;
}
int ret;
/* Instruct the cx18 to stop sending packets */
+ snd_cx18_lock(cxsc);
s = &cx->streams[CX18_ENC_STREAM_TYPE_PCM];
ret = cx18_stop_v4l2_encode_stream(s, 0);
clear_bit(CX18_F_S_STREAMING, &s->s_flags);
cx18_release_stream(s);
cx->pcm_announce_callback = NULL;
+ snd_cx18_unlock(cxsc);
return 0;
}