Playback of AudioCDs via HTTP server

This commit is contained in:
craig.p.drummond
2013-03-14 19:32:27 +00:00
committed by craig.p.drummond
parent d153d9bf25
commit 12f87d19a7
7 changed files with 27 additions and 37 deletions

View File

@@ -25,6 +25,10 @@
#include "httpsocket.h"
#include "httpserver.h"
#include "settings.h"
#if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
#include "cdparanoia.h"
#include "extractjob.h"
#endif
#include <QTcpSocket>
#include <QNetworkInterface>
#include <QStringList>
@@ -45,11 +49,6 @@
#include <taglib/audioproperties.h>
#endif
#ifdef CDDB_PLAYBACK
#include "cdparanoia.h"
#include "extractjob.h"
#endif
static QString detectMimeType(const QString &file)
{
#ifdef ENABLE_KDE_SUPPORT
@@ -255,14 +254,13 @@ void HttpSocket::readClient()
bool ok=false;
if (q.hasQueryItem("cantata")) {
#ifdef CDDB_PLAYBACK
// Not working :-( No sound is played, plus thi seems to continue until Cantata is stopped??
Song song=HttpServer::self()->decodeUrl(url);
if (song.file.startsWith(QLatin1String("cdda:/"))) {
#if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
QStringList parts=song.file.split("/", QString::SkipEmptyParts);
if (parts.length()>=3) {
QString dev=QLatin1Char('/')+parts.at(1)+QLatin1Char('/')+parts.at(2);
CdParanoia cdparanoia(dev, false, false);
CdParanoia cdparanoia(dev, false, false, true);
if (cdparanoia) {
int firstSector = cdparanoia.firstSectorOfTrack(song.id);
@@ -272,28 +270,29 @@ void HttpSocket::readClient()
ok=true;
writeMimeType(QLatin1String("audio/x-wav"), socket);
ExtractJob::writeWavHeader(*socket);
while (!terminated && (firstSector+count) <= lastSector) {
bool stop=false;
while (!terminated && (firstSector+count) <= lastSector && !stop) {
qint16 *buf = cdparanoia.read();
if (!buf) {
ok=false;
break;
}
char *buffer=(char *)buf;
qint64 writePos=0;
do {
qint64 bytesWritten = socket->write(&buffer[writePos], CD_FRAMESIZE_RAW - writePos);
if (-1==bytesWritten) {
ok=false;
if (terminated || -1==bytesWritten) {
stop=true;
break;
}
socket->flush();
writePos+=bytesWritten;
} while (!terminated && writePos<CD_FRAMESIZE_RAW);
count++;
}
}
}
#endif
} else {
#endif
QFile f(url.path());
if (f.open(QIODevice::ReadOnly)) {
@@ -304,11 +303,9 @@ void HttpSocket::readClient()
qint64 totalBytes = f.size();
qint64 readPos = 0;
qint64 bytesRead = 0;
bool stop=false;
do {
if (terminated) {
break;
}
bytesRead = f.read(buffer, constChunkSize);
readPos+=bytesRead;
if (bytesRead<0 || terminated) {
@@ -318,24 +315,20 @@ void HttpSocket::readClient()
qint64 writePos=0;
do {
qint64 bytesWritten = socket->write(&buffer[writePos], bytesRead - writePos);
if (terminated) {
break;
}
if (-1==bytesWritten) {
ok=false;
if (terminated || -1==bytesWritten) {
stop=true;
break;
}
socket->flush();
writePos+=bytesWritten;
} while (writePos<bytesRead);
if (f.atEnd()) {
break;
}
} while ((readPos+bytesRead)<totalBytes);
} while ((readPos+bytesRead)<totalBytes && !stop && !terminated);
}
#ifdef CDDB_PLAYBACK
}
#endif
}
if (!ok) {