diff --git a/lib/audio.js b/lib/audio.js index f6cc628..e9de1e4 100644 --- a/lib/audio.js +++ b/lib/audio.js @@ -14,7 +14,7 @@ // ---------------------------------------------------------------------------------- const exec = require('child_process').exec; -// const execSync = require('child_process').execSync; +const execSync = require('child_process').execSync; const util = require('./util'); // const fs = require('fs'); @@ -38,29 +38,44 @@ const winPrinterStatus = { 7: 'Offline', } -function parseLinuxCupsHeader(lines) { - const result = {} - if (lines && lines.length) { - if (lines[0].indexOf(' CUPS v') > 0) { - const parts = lines[0].split(' CUPS v'); - result.cupsVersion = parts[1]; +function getLinuxAudioPci() { + let cmd = 'lspci -v 2>/dev/null' + let result = []; + try { + const parts = execSync(cmd).toString().split('\n\n'); + for (let i = 0; i < parts.length; i++) { + const lines = parts[i].split('\n'); + if (lines && lines.length && lines[0].toLowerCass().indexOf('audio') >= 0) { + const audio = {}; + audio.slotId = lines[0].split(' ')[0]; + audio.driver = util.getValue(lines, 'Kernel driver in use', ':', true) || util.getValue(lines, 'Kernel modules', ':', true) + result.push(audio); + } } + return result; + } catch (e) { + return result; } - return result; } -function parseLinuxCupsPrinter(lines) { +function parseLinuxAudioPciMM(lines, audioPCI) { const result = {}; - const printerId = util.getValue(lines, 'PrinterId', ' '); - result.id = printerId ? parseInt(printerId, 10) : null; - result.name = util.getValue(lines, 'Info', ' '); - result.model = lines.length > 0 && lines[0] ? lines[0].split(' ')[0] : ''; - result.uri = util.getValue(lines, 'DeviceURI', ' '); - result.uuid = util.getValue(lines, 'UUID', ' '); - result.status = util.getValue(lines, 'State', ' '); - result.local = util.getValue(lines, 'Location', ' ').toLowerCase().startsWith('local'); + const slotId = util.getValue(lines, 'Slot'); + + const pciMatch = audioPCI.filter(function (item) { return item.slotId === slotId }) + + result.id = slotId; + result.name = util.getValue(lines, 'SDevice'); + result.type = util.getValue(lines, 'Class'); + result.manufacturer = util.getValue(lines, 'SVendor'); + result.builtIn = null; result.default = null; - result.shared = util.getValue(lines, 'Shared', ' ').toLowerCase().startsWith('yes'); + result.revision = util.getValue(lines, 'Revision'); + result.driver = pciMatch && pciMatch.length === 1 && pciMatch[0].driver ? pciMatch[0].driver : ''; + result.channel = null; + result.in = null; + result.out = null; + result.status = 'online'; return result; } @@ -80,6 +95,7 @@ function parseLinuxLpstatPrinter(lines, id) { return result; } +// id // name // type // manufacturer @@ -147,17 +163,18 @@ function audio(callback) { process.nextTick(() => { let result = []; if (_linux || _freebsd || _openbsd || _netbsd) { - let cmd = 'cat /etc/cups/printers.conf 2>/dev/null' + let cmd = 'lspci -vmm 2>/dev/null' exec(cmd, function (error, stdout) { - // printers.conf + // PCI if (!error) { - const parts = stdout.toString().split('= 0) { + const audio = parseLinuxAudioPciMM(lines, audioPCI); + result.push(audio); + } } } if (result.length === 0) { @@ -195,9 +212,9 @@ function audio(callback) { if (!error) { try { const outObj = JSON.parse(stdout.toString()); - if (outObj.SPAudioDataType && outObj.SPAudioDataType.length) { - for (let i = 0; i < outObj.SPAudioDataType.length; i++) { - const audio = parseDarwinAudio(outObj.SPAudioDataType[i], i); + if (outObj.SPAudioDataType && outObj.SPAudioDataType.length && outObj.SPAudioDataType[0] && outObj.SPAudioDataType[0]['_items'] && outObj.SPAudioDataType[0]['_items'].length) { + for (let i = 0; i < outObj.SPAudioDataType[0]['_items'].length; i++) { + const audio = parseDarwinAudio(outObj.SPAudioDataType[0]['_items'][i], i); result.push(audio); } }