diff --git a/sunshine/config.cpp b/sunshine/config.cpp index 01c09cfe..64e8bf7a 100644 --- a/sunshine/config.cpp +++ b/sunshine/config.cpp @@ -79,14 +79,14 @@ std::optional> parse_line(std::string_view:: std::unordered_map parse_config(std::string_view file_content) { std::unordered_map vars; - auto pos = std::begin(file_content) - 1; + auto pos = std::begin(file_content); auto end = std::end(file_content); - while(pos <= end) { - auto newline = std::find(pos, end, '\n'); - auto var = parse_line(pos, *(newline - 1) == '\r' ? newline - 1 : newline); + while(pos < end) { + auto newline = std::find_if(pos, end, [](auto ch) { return ch == '\n' || ch == '\r'; }); + auto var = parse_line(pos, newline); - pos = newline + 1; + pos = (*newline == '\r') ? newline + 2 : newline + 1; if(!var) { continue; } diff --git a/sunshine/input.cpp b/sunshine/input.cpp index 0940a54f..cf46cc96 100644 --- a/sunshine/input.cpp +++ b/sunshine/input.cpp @@ -299,5 +299,5 @@ void reset(std::shared_ptr &input) { task_pool.push(reset_helper, input); } -input_t::input_t() : gamepad_state { 0 }, back_timeout_id { nullptr }, input { platf::input() } {} +input_t::input_t() : gamepad_state {}, mouse_press {}, back_timeout_id { nullptr }, input { platf::input() } {} } diff --git a/sunshine/main.cpp b/sunshine/main.cpp index c2331608..7d179cfb 100644 --- a/sunshine/main.cpp +++ b/sunshine/main.cpp @@ -63,8 +63,6 @@ int main(int argc, char *argv[]) { boost::shared_ptr stream { &std::cout, NoDelete {} }; sink->locked_backend()->add_stream(stream); sink->set_filter(severity >= config::sunshine.min_log_level); -// sink->set_formatter(bl::expressions::stream -// << "log level "sv << severity << ": "sv << bl::expressions::smessage); sink->set_formatter([severity="Severity"s](const bl::record_view &view, bl::formatting_ostream &os) { auto log_level = view.attribute_values()[severity].extract().get(); diff --git a/sunshine/platform/common.h b/sunshine/platform/common.h index 0969972a..9c77e0fa 100644 --- a/sunshine/platform/common.h +++ b/sunshine/platform/common.h @@ -12,9 +12,13 @@ namespace platf { struct img_t { public: - std::uint8_t *data; - std::int32_t width; - std::int32_t height; + std::uint8_t *data {}; + std::int32_t width {}; + std::int32_t height {}; + + img_t() = default; + img_t(const img_t&) = delete; + img_t(img_t&&) = delete; virtual ~img_t() = default; }; diff --git a/sunshine/platform/linux.cpp b/sunshine/platform/linux.cpp index b6b4dcc1..19d484cb 100644 --- a/sunshine/platform/linux.cpp +++ b/sunshine/platform/linux.cpp @@ -28,6 +28,7 @@ namespace platf { using namespace std::literals; void freeImage(XImage *); +void freeX(XFixesCursorImage *); using ifaddr_t = util::safe_ptr; using xcb_connect_t = util::safe_ptr; @@ -36,6 +37,7 @@ using xcb_cursor_img = util::c_ptr; using xdisplay_t = util::safe_ptr_v2; using ximg_t = util::safe_ptr; +using xcursor_t = util::safe_ptr; class shm_id_t { public: @@ -80,13 +82,19 @@ struct x11_img_t : public img_t { struct shm_img_t : public img_t { ~shm_img_t() override { if(data) { - delete(data); + delete[] data; } } }; void blend_cursor(Display *display, std::uint8_t *img_data, int width, int height) { - XFixesCursorImage *overlay = XFixesGetCursorImage(display); + xcursor_t overlay { XFixesGetCursorImage(display) }; + + if(!overlay) { + BOOST_LOG(error) << "Couldn't get cursor from XFixesGetCursorImage"sv; + return; + } + overlay->x -= overlay->xhot; overlay->y -= overlay->yhot; @@ -219,10 +227,16 @@ struct shm_attr_t : public x11_attr_t { return capture_e::reinit; } - img->data = new std::uint8_t[frame_size()]; - img->width = display->width_in_pixels; - img->height = display->height_in_pixels; + if(img->width != display->width_in_pixels || img->height != display->height_in_pixels) { + if(img->data) { + delete[] img->data; + } + img->data = new std::uint8_t[frame_size()]; + img->width = display->width_in_pixels; + img->height = display->height_in_pixels; + } + std::copy_n((std::uint8_t*)data.data, frame_size(), img->data); if(cursor) { @@ -408,4 +422,7 @@ std::string get_local_ip() { return get_local_ip(AF_INET); } void freeImage(XImage *p) { XDestroyImage(p); } +void freeX(XFixesCursorImage *p) { + XFree(p); +} } diff --git a/sunshine/stream.cpp b/sunshine/stream.cpp index ebd5f2df..3fcf7f4e 100644 --- a/sunshine/stream.cpp +++ b/sunshine/stream.cpp @@ -657,8 +657,12 @@ void audioThread() { while (auto packet = packets->pop()) { audio_packet_t audio_packet { (audio_packet_raw_t*)malloc(sizeof(audio_packet_raw_t) + packet->size()) }; - audio_packet->rtp.sequenceNumber = util::endian::big(frame++); + audio_packet->rtp.header = 0; audio_packet->rtp.packetType = 97; + audio_packet->rtp.sequenceNumber = util::endian::big(frame++); + audio_packet->rtp.timestamp = 0; + audio_packet->rtp.ssrc = 0; + std::copy(std::begin(*packet), std::end(*packet), audio_packet->payload()); sock.send_to(asio::buffer((char*)audio_packet.get(), sizeof(audio_packet_raw_t) + packet->size()), *peer); @@ -925,7 +929,7 @@ void cmd_announce(host_t &host, peer_t peer, msg_t &&req) { if (whitespace(*pos++)) { lines.emplace_back(begin, pos - begin - 1); - while(whitespace(*pos)) { ++pos; } + while(pos != std::end(payload) && whitespace(*pos)) { ++pos; } begin = pos; } }