diff --git a/lib/Voicemeeter.psm1 b/lib/Voicemeeter.psm1 index 4d5519f..d132c4e 100644 --- a/lib/Voicemeeter.psm1 +++ b/lib/Voicemeeter.psm1 @@ -20,15 +20,11 @@ class Remote { [String]$vmpath [Hashtable]$kind [Object]$profiles - [String]$userpath - [String]$workingconfig Remote ([String]$kindId) { $this.vmpath = Setup_DLL $this.kind = GetKind($kindId) $this.profiles = Get_Profiles($this.kind.name) - $this.userpath = Join-Path ([Environment]::GetFolderPath('MyDocuments')) 'Voicemeeter' - $this.workingconfig = Join-Path $this.userpath ('vm' + $this.kind.name + '_working.xml') } [string] ToString() { diff --git a/lib/io.ps1 b/lib/io.ps1 index 3f75ab8..49d6f27 100644 --- a/lib/io.ps1 +++ b/lib/io.ps1 @@ -122,31 +122,32 @@ class IODevice : IRemote { { if ([string]::IsNullOrEmpty($this.name)) { return '' } - $path = $this.remote.workingconfig - $oldTime = if (Test-Path $path) { (Get-Item $path).LastWriteTime } else { [DateTime]::MinValue } - - $this.remote.Setter('Command.Save', $path) + $type = $null + try { + $tmp = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "vmrtmp-$(New-Guid).xml") + $this.remote.Setter('Command.Save', $tmp) $timeout = New-TimeSpan -Seconds 2 $sw = [Diagnostics.Stopwatch]::StartNew() $line = $null do { - if (Test-Path $path) { - $newTime = (Get-Item $path).LastWriteTime - if ($newTime -gt $oldTime) { + if (Test-Path $tmp) { try { - $line = Get-Content $path | Select-String -Pattern "<$($this.kindOfDevice)Dev index='$($this.index + 1)'" -List + $line = Get-Content $tmp | Select-String -Pattern "<$($this.kindOfDevice)Dev index='$($this.index + 1)'" -List if ($line) { break } } catch {} - } } Start-Sleep -Milliseconds 20 } while ($sw.elapsed -lt $timeout) - - $type = $null if ($line -and $line.ToString() -match "type='(?\d+)'") { $type = $matches['type'] + } + } + finally { + if (Test-Path $tmp) { + Remove-Item $tmp -Force + } } if ($type -notin $this.drivers.Keys) { return 'unknown' }