* select idle alternate when stopping the UVC device.

* set up a dumb deframer.
* received isochronous buffers can be zero length: loop instead of breaking.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41541 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2011-05-16 17:31:38 +00:00
parent ce8044a8cb
commit 22f4c33994
3 changed files with 43 additions and 2 deletions
@@ -589,7 +589,7 @@ CamDevice::DataPumpThread()
if (len <= 0) {
PRINT((CH ": IsoIn: %s" CT, strerror(len)));
break;
continue;
}
#ifndef DEBUG_DISCARD_DATA
@@ -9,6 +9,8 @@
#include <stdio.h>
#include "CamStreamingDeframer.h"
usb_webcam_support_descriptor kSupportedDevices[] = {
// ofcourse we support a generic UVC device...
@@ -58,9 +60,29 @@ print_guid(const usbvc_guid guid)
}
// TODO dumb sof_marks and eof_marks
static const uint8 sof_mark_1[] = { 0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x00 };
static const uint8 sof_mark_2[] = { 0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96, 0x01 };
static const uint8 *sof_marks[] = { sof_mark_1, sof_mark_2 };
static const uint8 eof_mark_1[] = { 0x00, 0x00, 0x00, 0x00 };
static const uint8 eof_mark_2[] = { 0x40, 0x00, 0x00, 0x00 };
static const uint8 eof_mark_3[] = { 0x80, 0x00, 0x00, 0x00 };
static const uint8 eof_mark_4[] = { 0xc0, 0x00, 0x00, 0x00 };
static const uint8 *eof_marks[] = { eof_mark_1, eof_mark_2, eof_mark_3, eof_mark_4 };
UVCCamDevice::UVCCamDevice(CamDeviceAddon &_addon, BUSBDevice* _device)
: CamDevice(_addon, _device)
: CamDevice(_addon, _device),
fHeaderDescriptor(NULL),
fInterruptIn(NULL)
{
fDeframer = new CamStreamingDeframer(this);
fDeframer->RegisterSOFTags(sof_marks, 2, sizeof(sof_mark_1), 12);
fDeframer->RegisterEOFTags(eof_marks, 4, sizeof(eof_mark_1), sizeof(eof_mark_1));
SetDataInput(fDeframer);
const BUSBConfiguration* config;
const BUSBInterface* interface;
usb_descriptor* generic;
@@ -519,6 +541,7 @@ UVCCamDevice::StartTransfer()
status_t
UVCCamDevice::StopTransfer()
{
_SelectIdleAlternate();
return CamDevice::StopTransfer();
}
@@ -649,6 +672,23 @@ UVCCamDevice::_SelectBestAlternate()
}
status_t
UVCCamDevice::_SelectIdleAlternate()
{
const BUSBConfiguration *config = fDevice->ActiveConfiguration();
const BUSBInterface *streaming = config->InterfaceAt(fStreamingIndex);
if (((BUSBInterface *)streaming)->SetAlternate(0) != B_OK) {
fprintf(stderr, "UVCCamDevice::_SelectIdleAlternate()"
" selecting alternate failed\n");
return B_ERROR;
}
fIsoIn = NULL;
return B_OK;
}
UVCCamDeviceAddon::UVCCamDeviceAddon(WebCamMediaAddOn* webcam)
: CamDeviceAddon(webcam)
{
@@ -34,6 +34,7 @@ private:
size_t len);
status_t _ProbeCommitFormat();
status_t _SelectBestAlternate();
status_t _SelectIdleAlternate();
usbvc_interface_header_descriptor *fHeaderDescriptor;