Added LPCM support to .wav output
This commit is contained in:
parent
f46d2a0c4a
commit
187ef6138c
1 changed files with 41 additions and 4 deletions
|
@ -40,6 +40,7 @@ namespace Mist{
|
||||||
capa["url_match"] = "/$.wav";
|
capa["url_match"] = "/$.wav";
|
||||||
capa["codecs"][0u][0u].append("ALAW");
|
capa["codecs"][0u][0u].append("ALAW");
|
||||||
capa["codecs"][0u][0u].append("MP3");
|
capa["codecs"][0u][0u].append("MP3");
|
||||||
|
capa["codecs"][0u][0u].append("PCM");
|
||||||
capa["methods"][0u]["handler"] = "http";
|
capa["methods"][0u]["handler"] = "http";
|
||||||
capa["methods"][0u]["type"] = "html5/audio/wav";
|
capa["methods"][0u]["type"] = "html5/audio/wav";
|
||||||
capa["methods"][0u]["priority"] = 1ll;
|
capa["methods"][0u]["priority"] = 1ll;
|
||||||
|
@ -59,6 +60,39 @@ namespace Mist{
|
||||||
char *dataPointer = 0;
|
char *dataPointer = 0;
|
||||||
unsigned int len = 0;
|
unsigned int len = 0;
|
||||||
thisPacket.getString("data", dataPointer, len);
|
thisPacket.getString("data", dataPointer, len);
|
||||||
|
|
||||||
|
//PCM must be converted to little-endian if > 8 bits per sample
|
||||||
|
static char * swappyPointer = 0;
|
||||||
|
static uint32_t swappySize = 0;
|
||||||
|
DTSC::Track & trk = myMeta.tracks[thisPacket.getTrackId()];
|
||||||
|
if (trk.codec == "PCM"){
|
||||||
|
if (trk.size > 8){
|
||||||
|
if (swappySize < len){
|
||||||
|
char * tmp = (char*)realloc(swappyPointer, len);
|
||||||
|
if (!tmp){
|
||||||
|
FAIL_MSG("Could not allocate data for PCM endianness swap!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
swappyPointer = tmp;
|
||||||
|
swappySize = len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (trk.size == 16){
|
||||||
|
for (uint32_t i = 0; i < len; i+=2){
|
||||||
|
swappyPointer[i] = dataPointer[i+1];
|
||||||
|
swappyPointer[i+1] = dataPointer[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (trk.size == 24){
|
||||||
|
for (uint32_t i = 0; i < len; i+=3){
|
||||||
|
swappyPointer[i] = dataPointer[i+2];
|
||||||
|
swappyPointer[i+1] = dataPointer[i+1];
|
||||||
|
swappyPointer[i+2] = dataPointer[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dataPointer = swappyPointer;
|
||||||
|
}
|
||||||
|
|
||||||
myConn.SendNow(dataPointer, len);
|
myConn.SendNow(dataPointer, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,14 +122,17 @@ namespace Mist{
|
||||||
// Send format details
|
// Send format details
|
||||||
uint16_t fmt = 0;
|
uint16_t fmt = 0;
|
||||||
if (Trk.codec == "ALAW"){fmt = 6;}
|
if (Trk.codec == "ALAW"){fmt = 6;}
|
||||||
|
if (Trk.codec == "PCM"){fmt = 1;}
|
||||||
if (Trk.codec == "MP3"){fmt = 85;}
|
if (Trk.codec == "MP3"){fmt = 85;}
|
||||||
myConn.SendNow(RIFF::fmt::generate(fmt, Trk.channels, Trk.rate, Trk.bps,
|
myConn.SendNow(RIFF::fmt::generate(fmt, Trk.channels, Trk.rate, Trk.bps,
|
||||||
Trk.channels * (Trk.size << 3), Trk.size));
|
Trk.channels * (Trk.size << 3), Trk.size));
|
||||||
// Send sample count per channel
|
// Send sample count per channel
|
||||||
if (!myMeta.live){
|
if (fmt != 1){//Not required for PCM
|
||||||
myConn.SendNow(RIFF::fact::generate(((Trk.lastms - Trk.firstms) * Trk.rate) / 1000));
|
if (!myMeta.live){
|
||||||
}else{
|
myConn.SendNow(RIFF::fact::generate(((Trk.lastms - Trk.firstms) * Trk.rate) / 1000));
|
||||||
myConn.SendNow(RIFF::fact::generate(0xFFFFFFFFul));
|
}else{
|
||||||
|
myConn.SendNow(RIFF::fact::generate(0xFFFFFFFFul));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Send MistServer identifier
|
// Send MistServer identifier
|
||||||
myConn.SendNow("LIST\026\000\000\000infoISFT\012\000\000\000MistServer", 30);
|
myConn.SendNow("LIST\026\000\000\000infoISFT\012\000\000\000MistServer", 30);
|
||||||
|
|
Loading…
Add table
Reference in a new issue