Committed after system build
diff --git a/system/configuration.nix b/system/configuration.nix
index d17dc00..6bb62f0 100644
--- a/system/configuration.nix
+++ b/system/configuration.nix
@@ -113,10 +113,98 @@
};
pulse.enable = true;
config.pipewire = {
- "context.exec" = [
+ "context.modules" = [
{
- path = "/usr/bin/pipewire";
- args = "-c /etc/pipewire/7.1-surround-sound.conf";
+ name = "libpipewire-module-filter-chain";
+ args = {
+ "node.name" = "effect_output.virtual-surround-7.1-hesuvi";
+ "node.description" = "Virtual Surround Sink";
+ "media.name" = "Virtual Surround Sink";
+ nodes = [
+ # duplicate inputs
+ { type = "builtin"; label = "copy"; name = "copyFL"; }
+ { type = "builtin"; label = "copy"; name = "copyFR"; }
+ { type = "builtin"; label = "copy"; name = "copyFC"; }
+ { type = "builtin"; label = "copy"; name = "copyRL"; }
+ { type = "builtin"; label = "copy"; name = "copyRR"; }
+ { type = "builtin"; label = "copy"; name = "copySL"; }
+ { type = "builtin"; label = "copy"; name = "copySR"; }
+ { type = "builtin"; label = "copy"; name = "copyLFE"; }
+
+ # apply hrir - HeSuVi 14-channel WAV (not the *-.wav variants) (note: */44/* in HeSuVi are the same, but resampled to 44100)
+ { type = "builtin"; label = "convolver"; name = "convFL_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 0; }; }
+ { type = "builtin"; label = "convolver"; name = "convFL_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 1; }; }
+ { type = "builtin"; label = "convolver"; name = "convSL_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 2; }; }
+ { type = "builtin"; label = "convolver"; name = "convSL_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 3; }; }
+ { type = "builtin"; label = "convolver"; name = "convRL_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 4; }; }
+ { type = "builtin"; label = "convolver"; name = "convRL_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 5; }; }
+ { type = "builtin"; label = "convolver"; name = "convFC_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 6; }; }
+ { type = "builtin"; label = "convolver"; name = "convFR_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 7; }; }
+ { type = "builtin"; label = "convolver"; name = "convFR_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 8; }; }
+ { type = "builtin"; label = "convolver"; name = "convSR_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 9; }; }
+ { type = "builtin"; label = "convolver"; name = "convSR_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 10; }; }
+ { type = "builtin"; label = "convolver"; name = "convRR_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 11; }; }
+ { type = "builtin"; label = "convolver"; name = "convRR_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 12; }; }
+ { type = "builtin"; label = "convolver"; name = "convFC_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 13; }; }
+
+ # treat LFE as FC
+ { type = "builtin"; label = "convolver"; name = "convLFE_R"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 13; }; }
+ { type = "builtin"; label = "convolver"; name = "convLFE_L"; config = { filename = "hrir_hesuvi/hrir.wav"; channel = 6; }; }
+
+ # stereo output
+ { type = "builtin"; label = "mixer"; name = "mixR"; }
+ { type = "builtin"; label = "mixer"; name = "mixL"; }
+ ];
+ links = [
+ # input
+ { output = "copyFL:Out"; input="convFL_L:In"; }
+ { output = "copyFL:Out"; input="convFL_R:In"; }
+ { output = "copySL:Out"; input="convSL_L:In"; }
+ { output = "copySL:Out"; input="convSL_R:In"; }
+ { output = "copyRL:Out"; input="convRL_L:In"; }
+ { output = "copyRL:Out"; input="convRL_R:In"; }
+ { output = "copyFC:Out"; input="convFC_L:In"; }
+ { output = "copyFR:Out"; input="convFR_R:In"; }
+ { output = "copyFR:Out"; input="convFR_L:In"; }
+ { output = "copySR:Out"; input="convSR_R:In"; }
+ { output = "copySR:Out"; input="convSR_L:In"; }
+ { output = "copyRR:Out"; input="convRR_R:In"; }
+ { output = "copyRR:Out"; input="convRR_L:In"; }
+ { output = "copyFC:Out"; input="convFC_R:In"; }
+ { output = "copyLFE:Out"; input="convLFE_L:In"; }
+ { output = "copyLFE:Out"; input="convLFE_R:In"; }
+
+ # output
+ { output = "convFL_L:Out"; input="mixL:In 1"; }
+ { output = "convFL_R:Out"; input="mixR:In 1"; }
+ { output = "convSL_L:Out"; input="mixL:In 2"; }
+ { output = "convSL_R:Out"; input="mixR:In 2"; }
+ { output = "convRL_L:Out"; input="mixL:In 3"; }
+ { output = "convRL_R:Out"; input="mixR:In 3"; }
+ { output = "convFC_L:Out"; input="mixL:In 4"; }
+ { output = "convFC_R:Out"; input="mixR:In 4"; }
+ { output = "convFR_R:Out"; input="mixR:In 5"; }
+ { output = "convFR_L:Out"; input="mixL:In 5"; }
+ { output = "convSR_R:Out"; input="mixR:In 6"; }
+ { output = "convSR_L:Out"; input="mixL:In 6"; }
+ { output = "convRR_R:Out"; input="mixR:In 7"; }
+ { output = "convRR_L:Out"; input="mixL:In 7"; }
+ { output = "convLFE_R:Out"; input="mixR:In 8"; }
+ { output = "convLFE_L:Out"; input="mixL:In 8"; }
+ ];
+ inputs = [ "copyFL:In" "copyFR:In" "copyFC:In" "copyLFE:In" "copyRL:In" "copyRR:In" "copySL:In" "copySR:In" ];
+ outputs = [ "mixL:Out" "mixR:Out" ];
+ };
+ "capture.props" = {
+ "media.class" = "Audio/Sink";
+ "audio.channels" = 8;
+ "audio.position" = [ "FL" "FR" "FC" "LFE" "RL" "RR" "SL" "SR" ];
+ };
+ "playback.props" = {
+ "node.passive" = true;
+ "audio.channels" = 2;
+ "audio.position" = [ "FL" "FR" ];
+ };
}
];
};