Merge branch 'v0.21.x' into master
This commit is contained in:
commit
291be84704
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user