Merge branch 'v0.21.x' into master

This commit is contained in:
Max Kellermann 2020-09-07 20:17:44 +02:00
commit 291be84704
5 changed files with 42 additions and 48 deletions

View File

@ -306,6 +306,24 @@ FileDescriptor::FullRead(void *_buffer, size_t length)
} }
} }
void
FileDescriptor::FullWrite(const void *_buffer, size_t length)
{
const uint8_t *buffer = (const uint8_t *)_buffer;
while (length > 0) {
ssize_t nbytes = Write(buffer, length);
if (nbytes <= 0) {
if (nbytes < 0)
throw MakeErrno("Failed to write");
throw std::runtime_error("Failed to write");
}
buffer += nbytes;
length -= nbytes;
}
}
#ifndef _WIN32 #ifndef _WIN32
int int

View File

@ -243,6 +243,12 @@ public:
return ::write(fd, buffer, length); return ::write(fd, buffer, length);
} }
/**
* Write until all of the given buffer has been written.
* Throws on error.
*/
void FullWrite(const void *buffer, size_t length);
#ifndef _WIN32 #ifndef _WIN32
int Poll(short events, int timeout) const noexcept; int Poll(short events, int timeout) const noexcept;

View File

@ -41,9 +41,9 @@ static void
tag_save(FILE *file, const Tag &tag) tag_save(FILE *file, const Tag &tag)
{ {
StdioOutputStream sos(file); StdioOutputStream sos(file);
BufferedOutputStream bos(sos); WithBufferedOutputStream(sos, [&](auto &bos){
tag_save(bos, tag); tag_save(bos, tag);
bos.Flush(); });
} }
int main(int argc, char **argv) int main(int argc, char **argv)

View File

@ -70,34 +70,6 @@ ReadOrThrow(FileDescriptor fd, void *buffer, size_t size)
return nbytes; return nbytes;
} }
static size_t
WriteOrThrow(FileDescriptor fd, const void *buffer, size_t size)
{
auto nbytes = fd.Write(buffer, size);
if (nbytes < 0)
throw MakeErrno("Write failed");
return nbytes;
}
static void
FullWrite(FileDescriptor fd, ConstBuffer<uint8_t> src)
{
while (!src.empty()) {
size_t nbytes = WriteOrThrow(fd, src.data, src.size);
if (nbytes == 0)
throw std::runtime_error("Write failed");
src.skip_front(nbytes);
}
}
static void
FullWrite(FileDescriptor fd, ConstBuffer<void> src)
{
FullWrite(fd, ConstBuffer<uint8_t>::FromVoid(src));
}
static size_t static size_t
ReadFrames(FileDescriptor fd, void *_buffer, size_t size, size_t frame_size) ReadFrames(FileDescriptor fd, void *_buffer, size_t size, size_t frame_size)
{ {
@ -166,14 +138,14 @@ try {
break; break;
auto dest = filter->FilterPCM({(const void *)buffer, (size_t)nbytes}); auto dest = filter->FilterPCM({(const void *)buffer, (size_t)nbytes});
FullWrite(output_fd, dest); output_fd.FullWrite(dest.data, dest.size);
} }
while (true) { while (true) {
auto dest = filter->Flush(); auto dest = filter->Flush();
if (dest.IsNull()) if (dest.IsNull())
break; break;
FullWrite(output_fd, dest); output_fd.FullWrite(dest.data, dest.size);
} }
/* cleanup and exit */ /* cleanup and exit */

View File

@ -124,26 +124,26 @@ static void
tag_save(FILE *file, const Tag &tag) tag_save(FILE *file, const Tag &tag)
{ {
StdioOutputStream sos(file); StdioOutputStream sos(file);
BufferedOutputStream bos(sos); WithBufferedOutputStream(sos, [&](auto &bos){
tag_save(bos, tag); tag_save(bos, tag);
bos.Flush(); });
} }
static int static int
dump_input_stream(InputStream *is) dump_input_stream(InputStream &is, FileDescriptor out)
{ {
std::unique_lock<Mutex> lock(is->mutex); std::unique_lock<Mutex> lock(is.mutex);
/* print meta data */ /* print meta data */
if (is->HasMimeType()) if (is.HasMimeType())
fprintf(stderr, "MIME type: %s\n", is->GetMimeType()); fprintf(stderr, "MIME type: %s\n", is.GetMimeType());
/* read data and tags from the stream */ /* read data and tags from the stream */
while (!is->IsEOF()) { while (!is.IsEOF()) {
{ {
auto tag = is->ReadTag(); auto tag = is.ReadTag();
if (tag) { if (tag) {
fprintf(stderr, "Received a tag:\n"); fprintf(stderr, "Received a tag:\n");
tag_save(stderr, *tag); tag_save(stderr, *tag);
@ -151,16 +151,14 @@ dump_input_stream(InputStream *is)
} }
char buffer[4096]; char buffer[4096];
size_t num_read = is->Read(lock, buffer, sizeof(buffer)); size_t num_read = is.Read(lock, buffer, sizeof(buffer));
if (num_read == 0) if (num_read == 0)
break; break;
ssize_t num_written = write(1, buffer, num_read); out.FullWrite(buffer, num_read);
if (num_written <= 0)
break;
} }
is->Check(); is.Check();
return 0; return 0;
} }
@ -233,7 +231,7 @@ try {
Mutex mutex; Mutex mutex;
auto is = InputStream::OpenReady(c.uri, mutex); auto is = InputStream::OpenReady(c.uri, mutex);
return dump_input_stream(is.get()); return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO));
} catch (...) { } catch (...) {
PrintException(std::current_exception()); PrintException(std::current_exception());
return EXIT_FAILURE; return EXIT_FAILURE;