File: ReadFrames.cxx

package info (click to toggle)
mpd 0.24.8-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,760 kB
  • sloc: cpp: 75,041; python: 1,408; xml: 628; perl: 469; java: 289; sh: 286; ansic: 235; makefile: 105
file content (36 lines) | stat: -rw-r--r-- 784 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright The Music Player Daemon Project

#include "ReadFrames.hxx"
#include "system/Error.hxx"
#include "io/FileDescriptor.hxx"

static size_t
ReadOrThrow(FileDescriptor fd, std::span<std::byte> dest)
{
	auto nbytes = fd.Read(dest);
	if (nbytes < 0)
		throw MakeErrno("Read failed");

	return nbytes;
}

std::size_t
ReadFrames(FileDescriptor fd, void *_buffer, std::size_t size,
	   std::size_t frame_size)
{
	auto buffer = (std::byte *)_buffer;

	size = (size / frame_size) * frame_size;

	size_t nbytes = ReadOrThrow(fd, {buffer, size});

	const size_t modulo = nbytes % frame_size;
	if (modulo > 0) {
		size_t rest = frame_size - modulo;
		fd.FullRead({(std::byte *)buffer + nbytes, rest});
		nbytes += rest;
	}

	return nbytes;
}