std::list<Move*> *Slide::DetermineNextSteps(Move *baseMove, Piece *piece, MoveStep *previousStep) { std::list<Move*> *moves = new std::list<Move*>(); // some steps will specify a different piece to act upon, rather than the piece being moved if (!moveSelf) { piece = baseMove->GetPieceByReference(pieceRef, piece); if (piece == 0) { ReportError("Referenced piece not found for slide move: %s\n", pieceRef); return moves; } } Player *player = baseMove->GetPlayer(); Game *game = player->GetGame(); direction_t dirs = player->ResolveDirections(direction, previousStep != 0 && previousStep->GetDirection() != 0 ? previousStep->GetDirection() : player->GetForwardDirection()); FOR_EACH_DIR_IN_SET(dirs, dir) { int boardMaxDist = piece->GetPosition()->GetMaxDist(dir); int minDist = distance->GetValue(previousStep, boardMaxDist); int maxDist = distance->GetMaxValue(distanceMax, previousStep, boardMaxDist); Cell *cell = piece->GetPosition(); for (int dist = 1; dist <= maxDist; dist++) { cell = cell->FollowLink(dir); if (cell == 0) break; Piece *target = cell->GetPiece(); if (dist >= minDist) { MoveStep *captureStep = 0; if (target == 0) { if (when == Capturing) continue; // needs to be a capture for this slide to be valid, and there is no piece here. But there might be pieces beyond this one. } else { if (when == Moving) break; else if (piece->CanCapture(target)) captureStep = CreateCapture(target, piece); else break; // cannot capture this piece. Slides cannot pass over pieces, so there can be no more valid slides in this direction. } Move *move = baseMove->Clone(); MoveStep *lastPerformedStep = move->GetSteps().empty() ? 0 : *move->GetSteps().rbegin(); if (captureStep != 0) { move->AddStep(captureStep); move->AddPieceReference(target, "target"); } move->AddStep(MoveStep::CreateMove(piece, piece->GetPosition(), cell, dir, dist)); if (conditions == 0 || conditions->IsSatisfied(piece, move, lastPerformedStep)) moves->push_back(move); else delete move; } if (target != 0) break; // Slides can't pass intervening pieces. As this cell was occupied, can be no more valid slides in this direction. } }
pxcStatus UtilCapture::LocateStreams(std::vector<PXCCapture::VideoStream::DataDesc*> &vinputs,std::vector<PXCCapture::AudioStream::DataDesc*> &ainputs) { UtilTrace trace(L"UtilCapture::LocateStreams(video)", m_session_service); if (vinputs.empty() && ainputs.empty()) return PXC_STATUS_ITEM_UNAVAILABLE; PXCCapture::AudioStream::DataDesc ainput; if (!ConsolidateAudioRequests(ainputs,&ainput)) return PXC_STATUS_ITEM_UNAVAILABLE; int n1=CalculateNumFormats(vinputs); pxcStatus sts; m_desc_filter.group=PXCSession::IMPL_GROUP_SENSOR; m_desc_filter.subgroup=(vinputs.size()>0?PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE:0)|(ainputs.size()>0?PXCSession::IMPL_SUBGROUP_AUDIO_CAPTURE:0); for (int module_idx=0;;module_idx++) { sts = CreateCapture(module_idx, m_capture.ReleaseRef()); if (sts == PXC_STATUS_ITEM_UNAVAILABLE) break; if (sts < PXC_STATUS_NO_ERROR) continue; PXCCapture::DeviceInfo dinfo; for (int device_idx=0;;device_idx++) { sts=m_capture->QueryDevice(device_idx,&dinfo); if (sts<PXC_STATUS_NO_ERROR) break; if (m_session_service) m_session_service->TraceParam(L"Locating stream(s) on device ", dinfo.name); if (m_name_filter) if (!wcsstr(dinfo.name,m_name_filter)) continue; sts=m_capture->CreateDevice(device_idx,m_device.ReleaseRef()); if (sts<PXC_STATUS_NO_ERROR) continue; /* Match image formats */ ClearMaps(vinputs); int n2=0; bool am=(ainputs.size()>0)?false:true; for (int stream_idx=0;;stream_idx++) { PXCCapture::Device::StreamInfo sinfo; sts=m_device->QueryStream(stream_idx, &sinfo); if (sts<PXC_STATUS_NO_ERROR) break; if (sinfo.cuid==PXCCapture::VideoStream::CUID && n2<n1) { PXCSmartPtr<PXCCapture::VideoStream> vstream; sts=m_device->CreateStream(stream_idx,PXCCapture::VideoStream::CUID,(void**)&vstream); if (sts<PXC_STATUS_NO_ERROR) break; std::list<PXCCapture::VideoStream::ProfileInfo> profiles; ScanProfiles(profiles,sinfo.imageType,vstream); int n3=MatchProfiles(vinputs,sinfo,profiles,(int)m_vstreams.size()); if (n3==0) continue; FindBestProfile(vinputs,profiles,(int)m_vstreams.size()); sts=vstream->SetProfile(&*profiles.begin()); if (sts<PXC_STATUS_NO_ERROR) break; m_vstreams.push_back(vstream.ReleasePtr()); n2+=n3; } if (sinfo.cuid==PXCCapture::AudioStream::CUID && !am) { sts=m_device->CreateStream(stream_idx, PXCCapture::AudioStream::CUID, (void**)m_astream.ReleaseRef()); if (sts<PXC_STATUS_NO_ERROR) continue; for (int profile_idx=0;;profile_idx++) { PXCCapture::AudioStream::ProfileInfo pinfo; sts=m_astream->QueryProfile(profile_idx,&pinfo); if (sts<PXC_STATUS_NO_ERROR) break; if (ainput.info.nchannels>0 && ainput.info.nchannels!=pinfo.audioInfo.nchannels) continue; if (ainput.info.sampleRate>0 && ainput.info.sampleRate!=pinfo.audioInfo.sampleRate) continue; if (ainput.info.bufferSize>0 && ainput.info.bufferSize!=pinfo.audioInfo.bufferSize) continue; if (ainput.info.channelMask>0 && ainput.info.channelMask!=pinfo.audioInfo.channelMask) continue; sts=m_astream->SetProfile(&pinfo); if (sts<PXC_STATUS_NO_ERROR) break; for (int i=0;i<(int)ainputs.size();i++) { memcpy_s(&ainputs[i]->info,sizeof(ainputs[i]->info),&pinfo.audioInfo,sizeof(pinfo.audioInfo)); ainputs[i]->options=pinfo.audioOptions; } am=true; break; } if (sts<PXC_STATUS_NO_ERROR) m_astream.ReleaseRef(); } if (sts>=PXC_STATUS_NO_ERROR && n2>=n1 && am) break; } if (sts>=PXC_STATUS_NO_ERROR && n2>=n1 && am) if (RecordProperties(vinputs)) break; DeleteStreams(); m_device.ReleaseRef(); } if (sts>=PXC_STATUS_NO_ERROR) { if (m_session_service) m_session_service->TraceParam(L"Successfully located streams on device ", dinfo.name); // update actual image size for (int i = 0; i < (int)vinputs.size() && i < (int)m_maps.size(); i++) { for (int c = 0; c < PXCCapture::VideoStream::STREAM_LIMIT; c++) { PXCCapture::VideoStream::ProfileInfo info; if (m_maps[i][c]<0) break; PXCCapture::VideoStream* vstream = m_vstreams[m_maps[i][c]]; if (!vstream) break; if (vstream->QueryProfile(&info) >= PXC_STATUS_NO_ERROR) { vinputs[i]->streams[c].sizeMin.width = info.imageInfo.width; vinputs[i]->streams[c].sizeMin.height = info.imageInfo.height; vinputs[i]->streams[c].sizeMax.width = info.imageInfo.width; vinputs[i]->streams[c].sizeMax.height = info.imageInfo.height; } } } break; } m_capture.ReleaseRef(); } return sts; }