UNPKG

node-mic

Version:

Microphone streaming library for Node.js

101 lines (100 loc) 2.89 kB
const regex = /In:([0-9.]+)% ([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2}) \[([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{2})\] Out:([0-9.]+)k? +?\[[\! \-\=]+\|([\! \-\=]+)\] Hd:([0-9.]+)? Clip:([0-9]+)/g; export function extractMetadata(info) { let infoStr = info; if (infoStr.indexOf("Hd:") === -1) { infoStr = info.replace(/]( )+Clip:/g, "] Hd:0.0 Clip:"); } const metadata = { in: 0.0, timestamp: 0, timestamp2: 0, out: 0.0, volume: 0, hd: 0, clip: 0, }; let m; while ((m = regex.exec(infoStr)) !== null) { if (m.index === regex.lastIndex) { regex.lastIndex++; } if (m.length < 2) { return 0; } let timestampItems; for (let i = 1, len = m.length; i < len; ++i) { switch (i) { case 1: metadata.in = parseFloat(m[i]); break; case 2: timestampItems = m.slice(2, 6); metadata.timestamp = extractTimestamp(timestampItems); i = i + 3; break; case 6: timestampItems = m.slice(6, 10); metadata.timestamp2 = extractTimestamp(timestampItems); i = i + 3; break; case 10: metadata.out = parseFloat(m[i]); break; case 11: metadata.volume = extractVolumeLevel(m[i]); break; case 12: metadata.hd = parseFloat(m[i]); break; case 13: metadata.clip = parseInt(m[i], 10); break; } } } return metadata; } function extractTimestamp(items) { let timestamp = 0; let value = 0; for (let i = 0, len = items.length; i < len; ++i) { value = parseInt(items[i], 10); switch (i) { case 0: value *= 60; case 1: value *= 60; case 2: value *= 1000; break; case 3: value *= 10; break; } timestamp = timestamp + value; } return timestamp; } ; function extractVolumeLevel(ascii) { let volume = 0; for (let i = 0, len = ascii.length; i < len; ++i) { switch (ascii[i]) { case " ": break; case "=": volume = volume + 2; break; case "-": volume = volume + 1; break; case "!": volume = volume + 4; break; default: break; } } return volume; } ;