util/AllocatedArray: migrate from {Const,Writable}Buffer to std::span

This commit is contained in:
Max Kellermann
2022-05-11 16:19:44 +02:00
committed by Max Kellermann
parent 23dd613ff9
commit 5fb97b81d1
15 changed files with 93 additions and 103 deletions

View File

@@ -760,7 +760,7 @@ Play_44_1_Silence(snd_pcm_t *pcm)
throw Alsa::MakeError(err, "snd_pcm_prepare() failed");
AllocatedArray<int16_t> buffer{channels * period_size};
buffer = {};
buffer = std::span<const int16_t>{};
/* play at least 250ms of silence */
for (snd_pcm_uframes_t remaining_frames = rate / 4;;) {

View File

@@ -172,7 +172,7 @@ HttpdOutput::ReadPage()
if (size == 0)
return nullptr;
return std::make_shared<Page>(ConstBuffer{buffer, size});
return std::make_shared<Page>(std::span{buffer, size});
}
inline void

View File

@@ -114,5 +114,5 @@ icy_server_metadata_page(const Tag &tag, const TagType *types) noexcept
if (icy_string == nullptr)
return nullptr;
return std::make_shared<Page>(ConstBuffer<std::byte>{(const std::byte *)icy_string.c_str(), uint8_t(icy_string[0]) * 16U + 1U});
return std::make_shared<Page>(std::span{(const std::byte *)icy_string.c_str(), uint8_t(icy_string[0]) * 16U + 1U});
}

View File

@@ -95,8 +95,8 @@ SnapcastClient::OnSocketReady(unsigned flags) noexcept
/* discard old chunks */
continue;
const ConstBuffer<std::byte> payload = chunk->payload;
if (!SendWireChunk(payload.ToVoid(), chunk->time)) {
const std::span payload = chunk->payload;
if (!SendWireChunk(payload, chunk->time)) {
// TODO: handle EAGAIN
LockClose();
return;
@@ -110,23 +110,23 @@ SnapcastClient::OnSocketReady(unsigned flags) noexcept
}
static bool
Send(SocketDescriptor s, ConstBuffer<void> buffer) noexcept
Send(SocketDescriptor s, std::span<const std::byte> buffer) noexcept
{
auto nbytes = s.Write(buffer.data, buffer.size);
return nbytes == ssize_t(buffer.size);
auto nbytes = s.Write(buffer.data(), buffer.size());
return nbytes == ssize_t(buffer.size());
}
template<typename T>
static bool
SendT(SocketDescriptor s, const T &buffer) noexcept
{
return Send(s, ConstBuffer<T>{&buffer, 1}.ToVoid());
return Send(s, std::as_bytes(std::span{&buffer, 1}));
}
static bool
Send(SocketDescriptor s, StringView buffer) noexcept
Send(SocketDescriptor s, std::string_view buffer) noexcept
{
return Send(s, buffer.ToVoid());
return Send(s, std::as_bytes(std::span{buffer}));
}
static bool
@@ -158,10 +158,10 @@ static bool
SendCodecHeader(SocketDescriptor s, const PackedBE16 id,
const SnapcastBase &request,
const StringView codec,
const ConstBuffer<void> payload) noexcept
const std::span<const std::byte> payload) noexcept
{
const PackedLE32 codec_size = codec.size;
const PackedLE32 payload_size = payload.size;
const PackedLE32 payload_size = payload.size();
SnapcastBase base{};
base.type = uint16_t(SnapcastMessageType::CODEC_HEADER);
@@ -169,7 +169,7 @@ SendCodecHeader(SocketDescriptor s, const PackedBE16 id,
base.refers_to = request.id;
base.sent = ToSnapcastTimestamp(std::chrono::steady_clock::now());
base.size = sizeof(codec_size) + codec.size +
sizeof(payload_size) + payload.size;
sizeof(payload_size) + payload.size();
return SendT(s, base) &&
SendT(s, codec_size) && Send(s, codec) &&
@@ -212,25 +212,25 @@ SnapcastClient::SendTime(const SnapcastBase &request_header,
static bool
SendWireChunk(SocketDescriptor s, const PackedBE16 id,
const ConstBuffer<void> payload,
const std::span<const std::byte> payload,
std::chrono::steady_clock::time_point t) noexcept
{
SnapcastWireChunk hdr{};
hdr.timestamp = ToSnapcastTimestamp(t);
hdr.size = payload.size;
hdr.size = payload.size();
SnapcastBase base{};
base.type = uint16_t(SnapcastMessageType::WIRE_CHUNK);
base.id = id;
base.sent = ToSnapcastTimestamp(std::chrono::steady_clock::now());
base.size = sizeof(hdr) + payload.size;
base.size = sizeof(hdr) + payload.size();
// TODO: no blocking send()
return SendT(s, base) && SendT(s, hdr) && Send(s, payload);
}
bool
SnapcastClient::SendWireChunk(ConstBuffer<void> payload,
SnapcastClient::SendWireChunk(std::span<const std::byte> payload,
std::chrono::steady_clock::time_point t) noexcept
{
return ::SendWireChunk(GetSocket(), next_id++, payload, t);
@@ -238,21 +238,21 @@ SnapcastClient::SendWireChunk(ConstBuffer<void> payload,
static bool
SendStreamTags(SocketDescriptor s, const PackedBE16 id,
const ConstBuffer<void> payload) noexcept
const std::span<const std::byte> payload) noexcept
{
const PackedLE32 payload_size = payload.size;
const PackedLE32 payload_size = payload.size();
SnapcastBase base{};
base.type = uint16_t(SnapcastMessageType::STREAM_TAGS);
base.id = id;
base.sent = ToSnapcastTimestamp(std::chrono::steady_clock::now());
base.size = sizeof(payload_size) + payload.size;
base.size = sizeof(payload_size) + payload.size();
return SendT(s, base) && SendT(s, payload_size) && Send(s, payload);
}
void
SnapcastClient::SendStreamTags(ConstBuffer<void> payload) noexcept
SnapcastClient::SendStreamTags(std::span<const std::byte> payload) noexcept
{
::SendStreamTags(GetSocket(), next_id++, payload);
}
@@ -270,7 +270,7 @@ SnapcastClient::OnSocketInput(void *data, size_t length) noexcept
ConsumeInput(sizeof(base) + base.size);
const ConstBuffer<void> payload{&base + 1, base.size};
const std::span<const std::byte> payload{(const std::byte *)(&base + 1), base.size};
switch (SnapcastMessageType(uint16_t(base.type))) {
case SnapcastMessageType::HELLO:
@@ -284,8 +284,8 @@ SnapcastClient::OnSocketInput(void *data, size_t length) noexcept
break;
case SnapcastMessageType::TIME:
if (payload.size >= sizeof(SnapcastTime))
SendTime(base, *(const SnapcastTime *)payload.data);
if (payload.size() >= sizeof(SnapcastTime))
SendTime(base, *(const SnapcastTime *)(const void *)payload.data());
break;
default:

View File

@@ -26,6 +26,7 @@
#include <chrono>
#include <cstdint>
#include <span>
struct SnapcastBase;
struct SnapcastTime;
@@ -60,7 +61,7 @@ public:
void LockClose() noexcept;
void SendStreamTags(ConstBuffer<void> payload) noexcept;
void SendStreamTags(std::span<const std::byte> payload) noexcept;
/**
* Caller must lock the mutex.
@@ -84,7 +85,7 @@ public:
private:
SnapcastChunkPtr LockPopQueue() noexcept;
bool SendWireChunk(ConstBuffer<void> payload,
bool SendWireChunk(std::span<const std::byte> payload,
std::chrono::steady_clock::time_point t) noexcept;
bool SendServerSettings(const SnapcastBase &request) noexcept;

View File

@@ -161,9 +161,8 @@ public:
return "pcm";
}
ConstBuffer<void> GetCodecHeader() const noexcept {
ConstBuffer<std::byte> result(codec_header);
return result.ToVoid();
std::span<const std::byte> GetCodecHeader() const noexcept {
return codec_header;
}
/* virtual methods from class AudioOutput */

View File

@@ -127,7 +127,7 @@ ReadEncoder(Encoder &encoder)
std::byte buffer[4096];
size_t nbytes = encoder.Read(buffer, sizeof(buffer));
const ConstBuffer<std::byte> src(buffer, nbytes);
const std::span<const std::byte> src{buffer, nbytes};
return AllocatedArray<std::byte>{src};
}
@@ -181,7 +181,7 @@ SnapcastOutput::Close() noexcept
ClearQueue(chunks);
codec_header = nullptr;
codec_header = std::span<const std::byte>{};
delete encoder;
}
@@ -294,12 +294,12 @@ SnapcastOutput::SendTag(const Tag &tag)
if (json.empty())
return;
const ConstBuffer payload(json.data(), json.size());
const auto payload = std::as_bytes(std::span{json});
const std::scoped_lock<Mutex> protect(mutex);
// TODO: enqueue StreamTags, don't send directly
for (auto &client : clients)
client.SendStreamTags(payload.ToVoid());
client.SendStreamTags(payload);
#else
(void)tag;
#endif
@@ -348,7 +348,7 @@ SnapcastOutput::Play(const void *chunk, size_t size)
if (chunks.empty())
inject_event.Schedule();
const ConstBuffer payload{buffer, nbytes};
const std::span<const std::byte> payload{buffer, nbytes};
chunks.push(std::make_shared<SnapcastChunk>(now, AllocatedArray{payload}));
}