Skip to content

Commit

Permalink
FIX: copy BambuSource.dll for camera use
Browse files Browse the repository at this point in the history
Change-Id: If311e2827eda655bf7cd7294f9c0749f1dd7b545
  • Loading branch information
bambu123 authored and lanewei120 committed Dec 15, 2022
1 parent d8f0749 commit e8d7962
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 33 deletions.
88 changes: 56 additions & 32 deletions src/slic3r/GUI/MediaPlayCtrl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,16 +267,9 @@ void MediaPlayCtrl::ToggleStream()
std::string url;
if (!get_stream_url(&url)) {
// create stream pipeline
#ifdef __WIN32__
std::string file_source = data_dir() + "\\cameratools\\bambu_source.exe";
std::string file_ffmpeg = data_dir() + "\\cameratools\\ffmpeg.exe";
std::string file_ff_cfg = data_dir() + "\\cameratools\\ffmpeg.cfg";
#else
std::string file_source = data_dir() + "/cameratools/bambu_source";
std::string file_ffmpeg = data_dir() + "/cameratools/ffmpeg";
std::string file_ff_cfg = data_dir() + "/cameratools/ffmpeg.cfg";
#endif
if (!boost::filesystem::exists(file_source) || !boost::filesystem::exists(file_ffmpeg) || !boost::filesystem::exists(file_ff_cfg)) {
bool need_install = false;
if (!start_stream_service(&need_install)) {
if (!need_install) return;
auto res = MessageDialog(this->GetParent(), _L("Virtual Camera Tools is required for this task!\nDo you want to install them?"), _L("Info"),
wxOK | wxCANCEL).ShowModal();
if (res == wxID_OK) {
Expand Down Expand Up @@ -305,28 +298,6 @@ void MediaPlayCtrl::ToggleStream()
}
return;
}
wxString url = L"bambu:///camera/" + from_u8(file_url);
url.Replace("\\", "/");
url = wxURI(url).BuildURI();
try {
std::string configs;
boost::filesystem::load_string_file(file_ff_cfg, configs);
std::vector<std::string> configss;
boost::algorithm::split(configss, configs, boost::algorithm::is_any_of("\r\n"));
configss.erase(std::remove(configss.begin(), configss.end(), std::string()), configss.end());
boost::process::pipe intermediate;
#ifndef __WXMSW__
boost::filesystem::permissions(file_source, boost::filesystem::owner_exe | boost::filesystem::add_perms);
boost::filesystem::permissions(file_ffmpeg, boost::filesystem::owner_exe | boost::filesystem::add_perms);
#endif
boost::process::child process_source(file_source, url.data().AsInternal(), boost::process::std_out > intermediate, detach_process(),
boost::process::start_dir(boost::filesystem::path(data_dir()) / "plugins"), boost::process::limit_handles);
boost::process::child process_ffmpeg(file_ffmpeg, configss, boost::process::std_in < intermediate, detach_process(), boost::process::limit_handles);
process_source.detach();
process_ffmpeg.detach();
} catch (std::exception & e) {
BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl failed to start camera stream: " << e.what();
}
}
if (!url.empty() && wxGetApp().app_config->get("not_show_vcamera_stop_prev") != "1") {
MessageDialog dlg(this->GetParent(), _L("Another virtual camera is running.\nBambu Studio supports only a single virtual camera.\nDo you want to stop this virtual camera?"), _L("Warning"),
Expand Down Expand Up @@ -421,6 +392,59 @@ void MediaPlayCtrl::media_proc()
}
}

bool MediaPlayCtrl::start_stream_service(bool *need_install)
{
#ifdef __WIN32__
std::string file_source = data_dir() + "\\cameratools\\bambu_source.exe";
std::string file_ffmpeg = data_dir() + "\\cameratools\\ffmpeg.exe";
std::string file_ff_cfg = data_dir() + "\\cameratools\\ffmpeg.cfg";
#else
std::string file_source = data_dir() + "/cameratools/bambu_source";
std::string file_ffmpeg = data_dir() + "/cameratools/ffmpeg";
std::string file_ff_cfg = data_dir() + "/cameratools/ffmpeg.cfg";
#endif
if (!boost::filesystem::exists(file_source) || !boost::filesystem::exists(file_ffmpeg) || !boost::filesystem::exists(file_ff_cfg)) {
if (need_install) *need_install = true;
return false;
}
std::string file_url = data_dir() + "/cameratools/url.txt";
if (!boost::filesystem::exists(file_url)) {
boost::nowide::ofstream file(file_url);
file.close();
}
wxString file_url2 = L"bambu:///camera/" + from_u8(file_url);
file_url2.Replace("\\", "/");
file_url2 = wxURI(file_url2).BuildURI();
try {
std::string configs;
boost::filesystem::load_string_file(file_ff_cfg, configs);
std::vector<std::string> configss;
boost::algorithm::split(configss, configs, boost::algorithm::is_any_of("\r\n"));
configss.erase(std::remove(configss.begin(), configss.end(), std::string()), configss.end());
boost::process::pipe intermediate;
boost::filesystem::path start_dir(boost::filesystem::path(data_dir()) / "plugins");
#ifdef __WXMSW__
start_dir = boost::filesystem::path(data_dir()) / "cameratools";
std::string file_dll = data_dir() + "/cameratools/BambuSource.dll";
std::string file_dll2 = data_dir() + "/plugins/BambuSource.dll";
if (!boost::filesystem::exists(file_dll) || boost::filesystem::last_write_time(file_dll) != boost::filesystem::last_write_time(file_dll2))
boost::filesystem::copy_file(file_dll2, file_dll, boost::filesystem::copy_option::overwrite_if_exists);
#else
boost::filesystem::permissions(file_source, boost::filesystem::owner_exe | boost::filesystem::add_perms);
boost::filesystem::permissions(file_ffmpeg, boost::filesystem::owner_exe | boost::filesystem::add_perms);
#endif
boost::process::child process_source(file_source, file_url2.data().AsInternal(), boost::process::std_out > intermediate, detach_process(),
boost::process::start_dir(start_dir), boost::process::limit_handles);
boost::process::child process_ffmpeg(file_ffmpeg, configss, boost::process::std_in < intermediate, detach_process(), boost::process::limit_handles);
process_source.detach();
process_ffmpeg.detach();
} catch (std::exception &e) {
BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl failed to start camera stream: " << e.what();
return false;
}
return true;
}

bool MediaPlayCtrl::get_stream_url(std::string *url)
{
#ifdef __WIN32__
Expand Down
4 changes: 3 additions & 1 deletion src/slic3r/GUI/MediaPlayCtrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ class MediaPlayCtrl : public wxPanel

void media_proc();

bool get_stream_url(std::string * url = nullptr);
static bool start_stream_service(bool *need_install = nullptr);

static bool get_stream_url(std::string *url = nullptr);

private:
static constexpr wxMediaState MEDIASTATE_IDLE = (wxMediaState) 3;
Expand Down

0 comments on commit e8d7962

Please sign in to comment.