X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=stream.cpp;h=4be673c864410e9ddfda17675e9d9137b672da71;hb=e0b47eba2f5ec1aca1d02adc9fb4ffc7293d5c0f;hp=5ea2cd03601491f8fe64070fd4b33b71f33dd4d8;hpb=7c26826d3c485f4f18a6c427f520dc470e68f94a;p=cubemap diff --git a/stream.cpp b/stream.cpp index 5ea2cd0..4be673c 100644 --- a/stream.cpp +++ b/stream.cpp @@ -119,26 +119,6 @@ void Stream::put_client_to_sleep(Client *client) sleeping_clients.push_back(client); } -void Stream::add_data(const char *data, ssize_t bytes) -{ - if (encoding == Stream::STREAM_ENCODING_RAW) { - add_data_raw(data, bytes); - } else if (encoding == STREAM_ENCODING_METACUBE) { - metacube_block_header hdr; - memcpy(hdr.sync, METACUBE_SYNC, sizeof(hdr.sync)); - hdr.size = htonl(bytes); - hdr.flags = htonl(0); - - char *block = new char[bytes + sizeof(hdr)]; - memcpy(block, &hdr, sizeof(hdr)); - memcpy(block + sizeof(hdr), data, bytes); - add_data_raw(block, bytes + sizeof(hdr)); - delete[] block; - } else { - assert(false); - } -} - void Stream::add_data_raw(const char *data, ssize_t bytes) { size_t pos = bytes_received % backlog_size; @@ -180,8 +160,36 @@ void Stream::add_data_raw(const char *data, ssize_t bytes) } } -void Stream::wake_up_all_clients() +void Stream::add_data_deferred(const char *data, size_t bytes) +{ + if (encoding == Stream::STREAM_ENCODING_RAW) { + queued_data.append(string(data, data + bytes)); + } else if (encoding == STREAM_ENCODING_METACUBE) { + metacube_block_header hdr; + memcpy(hdr.sync, METACUBE_SYNC, sizeof(hdr.sync)); + hdr.size = htonl(bytes); + hdr.flags = htonl(0); + + char *block = new char[bytes + sizeof(hdr)]; + memcpy(block, &hdr, sizeof(hdr)); + memcpy(block + sizeof(hdr), data, bytes); + queued_data.append(string(block, block + bytes + sizeof(hdr))); + delete[] block; + } else { + assert(false); + } +} + +void Stream::process_queued_data() { + if (queued_data.empty()) { + return; + } + + add_data_raw(queued_data.data(), queued_data.size()); + queued_data.clear(); + + // We have more data, so wake up all clients. if (to_process.empty()) { swap(sleeping_clients, to_process); } else {