• Welcome to ASR. There are many reviews of audio hardware and expert members to help answer your questions. Click here to have your audio equipment measured for free!

Introducing DSPi | A powerful, user friendly and open source DSP for less than a cup of coffee

Hi Troy,
Concerning the SPDIF input, I've noticed that when the toslink receiver is attached to the RP2040, the volume level (both visually on the input VU meters and audio-wise) is almost 6dB lower than when using the same receiver with the RP2350. Both Pico boards are running on factory default settings.
Thank you for pointing this out. There is actually scaling bug on the SPDIF input for the RP2040 that results in 12dB of input volume reduction. This will be patched in a hotfix.
 
I just released v1.0.0 of my dspictl command-line tool. It roughly does what the console does, but on the command line.

Code:
$ dspictl
Control DSPi audio devices

Usage:
  dspictl [command]

Available Commands:
  bootloader    Reboot into UF2 bootloader for firmware updates
  buffer-stats  Read buffer fill statistics
  channel-name  Read or write user-configurable channel names
  clear-clips   Clear clip detection latches
  completion    Generate the autocompletion script for the specified shell
  config        Hardware configuration
  core1         Query Core 1 operating mode
  factory-reset Reset live DSP state to factory defaults
  help          Help about any command
  matrix        Matrix mixer crosspoint control
  mute          Mute master volume
  output        Per-output gain, mute, delay, enable/disable
  preamp        Per-channel input preamp get/set
  preset        Preset slot management (slots 0-9)
  status        Show a summary of connected DSPi devices
  targets       List discovered DSPi devices
  unmute        Unmute master volume to firmware default (-20 dB)
  usb-errors    Read USB PHY error counters
  volume        Master volume get/set

Flags:
  -h, --help            help for dspictl
      --target string   Operate on a specific device by serial number

Use "dspictl [command] --help" for more information about a command.

I left the best part for the next release: EQ management, loudness, crossfeed, and volume leveller.

Currently the binaries are published for Linux only (AMD64, ARM64 and ARM, incl. Raspberry Pi 3 and later), but since it is written in Go it also runs on macOS and should run on Windows. I just haven't completed the build matrix yet.

Source code is available on GitHub as suhlig/dspictl. Please file bugs and feature requests there.

Thanks @Weeb Labs for the great DSPi project!
 
I just released v1.0.0 of my dspictl command-line tool. It roughly does what the console does, but on the command line.

Code:
$ dspictl
Control DSPi audio devices

Usage:
  dspictl [command]

Available Commands:
  bootloader    Reboot into UF2 bootloader for firmware updates
  buffer-stats  Read buffer fill statistics
  channel-name  Read or write user-configurable channel names
  clear-clips   Clear clip detection latches
  completion    Generate the autocompletion script for the specified shell
  config        Hardware configuration
  core1         Query Core 1 operating mode
  factory-reset Reset live DSP state to factory defaults
  help          Help about any command
  matrix        Matrix mixer crosspoint control
  mute          Mute master volume
  output        Per-output gain, mute, delay, enable/disable
  preamp        Per-channel input preamp get/set
  preset        Preset slot management (slots 0-9)
  status        Show a summary of connected DSPi devices
  targets       List discovered DSPi devices
  unmute        Unmute master volume to firmware default (-20 dB)
  usb-errors    Read USB PHY error counters
  volume        Master volume get/set

Flags:
  -h, --help            help for dspictl
      --target string   Operate on a specific device by serial number

Use "dspictl [command] --help" for more information about a command.

I left the best part for the next release: EQ management, loudness, crossfeed, and volume leveller.

Currently the binaries are published for Linux only (AMD64, ARM64 and ARM, incl. Raspberry Pi 3 and later), but since it is written in Go it also runs on macOS and should run on Windows. I just haven't completed the build matrix yet.

Source code is available on GitHub as suhlig/dspictl. Please file bugs and feature requests there.

Thanks @Weeb Labs for the great DSPi project!
Excellent work! I've been meaning to work on DSPi Terminal but it has been difficult to find the time. I'm sure this will really come in handy for Linux users.

I have been working on the new crossover UI. This is by no means final but I believe it is fairly comprehensible.

1779240508837.png


What I may do next is to reduce the vertical padding of the header, add a fixed footer and then move the Clear All and XO tab controls to it. This would enable the remainder of the header's width to be used and I could add some other useful controls such as Bypass All.
 
Last edited:
Do you think these might cover most of the bases? :D

View attachment 533425


Hello and thank you for the kind words! The 20Hz filter lower limit is just a UI quirk that I will be patching for the next beta release. The firmware will parse filters down to 10Hz.

Regarding I2S input, this is not yet supported but will be added very soon.
That's great! Needless to say I'm amazed by the speed you implement new stuff :D I guess you have the benefit of not having to deal with morning standups and weekly sprint reviews XD
 
Hi Troy, now that you're implementing I2S input a question. I'm planning to use a DSPi in an existing device. That has SPDIF in, conversion to I2S and then into a SM5840AP. See schematics. As you can see the now used, and very aged, DSP uses I2S in (pin 3 for data) but only the digital data out (pin 9). The other signals are directly linked from the I2S source to the SM5840AP. Would this work with DSPi the same way? Or should I modify the PCB, break the links and use all necessary signals from DSPi out and connect these to the SM5840AP?

DSS930 I2S schematics.png


Another question, more generic. I have a PCM5102 module. I2S in, analog out. Now I could control the volume at the I2S output but I rather would do that in the analog domain. Does anyone here know of a similar I2S to analog DAC module with remote volume control in the analog signal path? Or an add-on analog module for remote volume control? Thanks.
 
I have just released DSPi Firmware v1.1.4-beta4.

This is a small release, as we are now approaching the final release candidate for v1.1.4. Once this release is finalised, we will begin seeing early v1.1.5 builds with the new crossover implementation.

Here are the changes:
  • RP2040: Fixed incorrect SPDIF input levels
  • RP2040/2350: Fixed EMC becoming stuck when switching input sources

DSPi Console for macOS will also be receiving a feature parity update this weekend. :)

Hi Troy,
Concerning the SPDIF input, I've noticed that when the toslink receiver is attached to the RP2040, the volume level (both visually on the input VU meters and audio-wise) is almost 6dB lower than when using the same receiver with the RP2350. Both Pico boards are running on factory default settings.
The above release squashes this bug!

LR6 is missing ;) But yes, most bases should be covered.
LR6 has now been added to the crossover branch.

Hi Troy, now that you're implementing I2S input a question. I'm planning to use a DSPi in an existing device. That has SPDIF in, conversion to I2S and then into a SM5840AP. See schematics. As you can see the now used, and very aged, DSP uses I2S in (pin 3 for data) but only the digital data out (pin 9). The other signals are directly linked from the I2S source to the SM5840AP. Would this work with DSPi the same way? Or should I modify the PCB, break the links and use all necessary signals from DSPi out and connect these to the SM5840AP?

View attachment 533932

Another question, more generic. I have a PCM5102 module. I2S in, analog out. Now I could control the volume at the I2S output but I rather would do that in the analog domain. Does anyone here know of a similar I2S to analog DAC module with remote volume control in the analog signal path? Or an add-on analog module for remote volume control? Thanks.
When I2S input becomes available, it will initially be master-only. Slave mode will come a little bit later but that would enable DSPi to be used as a drop-in replacement for the SM5840AP.

Regarding volume control, DSPi outputs I2S audio as 24-bit within 32-bit samples. This means you have 48dB of bit-perfect volume control attenuation range above the typical 96dB 16-bit dynamic range of content, which is equivalent to or better than an ideal analog potentiometer. When the conversion is updated to direct 32-bit output, this will be even better.
 
What a cool project! Congrats!:)
In fact after only reading here for a few years this finally made me register.

I started reading the whole thread but so far managed to get to page 14 or so..
Pls allow me some stupid questions:

I want to use this board for generating a centre channel and stereo base enhancement for my stereo setup.
Can the matrix mixer as is create the following:

Lnew = L -0.5R
Rnew = R -0.5L

and put those 2 new stereo channels out to a stereo TOSLINK channel?
I assume it can. You posted an image of the matrix mixer in post 180 where left input is always assigned to left outputs and right to right.
Can I assign to left output left input and additionally right input inverted and attenuated by 6dB? That should make up the formula.
The missing centre channel would the be recreated by just summing those 2 new stereo channels and giving them a 6dB rise. C = ( Lnew + Rnew ) +6dB
This operation will be done by my daisy chain of Hypex FA plateamps which also provide crossover and amplification for my 3 way speakers.
Obviously SPDIF input is already existing.
I assume it will also work with TOSLINK. Correct?
How many inputs are available? How do I select them?

Went through your readme on github but could not find the information there - nor schematics - which might just be me being a noob though.

Thanks for your help and the great project.
 
What a cool project! Congrats!:)
In fact after only reading here for a few years this finally made me register.

I started reading the whole thread but so far managed to get to page 14 or so..
Pls allow me some stupid questions:

I want to use this board for generating a centre channel and stereo base enhancement for my stereo setup.
Can the matrix mixer as is create the following:

Lnew = L -0.5R
Rnew = R -0.5L

and put those 2 new stereo channels out to a stereo TOSLINK channel?
I assume it can. You posted an image of the matrix mixer in post 180 where left input is always assigned to left outputs and right to right.
Can I assign to left output left input and additionally right input inverted and attenuated by 6dB? That should make up the formula.
The missing centre channel would the be recreated by just summing those 2 new stereo channels and giving them a 6dB rise. C = ( Lnew + Rnew ) +6dB
This operation will be done by my daisy chain of Hypex FA plateamps which also provide crossover and amplification for my 3 way speakers.
Obviously SPDIF input is already existing.
I assume it will also work with TOSLINK. Correct?
How many inputs are available? How do I select them?

Went through your readme on github but could not find the information there - nor schematics - which might just be me being a noob though.

Thanks for your help and the great project.
Hello, thank you and welcome!

You can absolutely do what you have asked. You can assign any input or inputs to any output or outputs, with a different inversion state at each crosspoint. The use case that you have described will soon be directly facilitated via the upcoming "three channel stereo" functionality.

The GitHub readme (be sure to select the working_spdif_input branch) contains default pin assignments and basic setup instructions but doesn't yet offer an explicit look at the question of what you can and can not do with it at this point in time. I will be sorting this out shortly, in addition to a comprehensive video.
 
I'm building my DSPi project. With the availability of SPDIF input and LG Soundsync, I figured that I don't need I2S input anymore and should be able to physically switch SPDIF inputs so I don't have to wait for control support.

The components are in place, I have a text plan for all my wiring and now just need to solder all the wires and test :) This will probably be for the next weekend.

I will have a physical rocker switch for the SPDIF inputs, one being the Toslink receiver for my LG TV, the other being a direct feed of the SPDIF output of the ESP32.
And the outputs are two SPDIFs, Toslink to my Wiim Vibelink Amp and Coax to my FiiO K5 headphone amp. Both active at the same time.

IMG_20260525_225157.jpg
 
Fantastic! If you feel your posts might divert this main dev thread, but don't want to create a new one you are welcome here
 
I'm building my DSPi project. ... Both active at the same time.

View attachment 534856
If you don't mind my 2c thoughts.

1) I'm a fan of soldering stuff but for the first build I'm allergic. You never know what you'll decide is wrong or not working well enough. Especially, imho, with optical inputs and both outputs. Looking at your board... you might think about doing this twice. First board use sockets for the processors or other means to retrieve your more expensive components just in case. I would worry about possible bypass caps for the optical ports. I've seen a few different hookup schematics. I've also, honestly, not had great success with spdif in. I love these things:
1779797604172.png


2) I try to extend the USB ports off/near the side of the board so it's easy to get fatter usb cables into them. This kind of does the opposite.

3) The ESP32 may generate RFI. I'd probably try to leave more space between it and the Pico processor. Conversely, you don't want long leads to the io devices since they can pick up RFI.
 
If you don't mind my 2c thoughts.

1) I'm a fan of soldering stuff but for the first build I'm allergic. You never know what you'll decide is wrong or not working well enough. Especially, imho, with optical inputs and both outputs. Looking at your board... you might think about doing this twice. First board use sockets for the processors or other means to retrieve your more expensive components just in case. I would worry about possible bypass caps for the optical ports. I've seen a few different hookup schematics. I've also, honestly, not had great success with spdif in. I love these things:
View attachment 534954

2) I try to extend the USB ports off/near the side of the board so it's easy to get fatter usb cables into them. This kind of does the opposite.

3) The ESP32 may generate RFI. I'd probably try to leave more space between it and the Pico processor. Conversely, you don't want long leads to the io devices since they can pick up RFI.
Thanks for sharing your feedback. For 2, this is a conscious choice, I plan to use only the Pico2's USB port and this is better for integration into my cabinet.

3 is a real concern for me. I guess I'll see if and how it works. I plan to have the ESP32 running Ethernet (already have the module) so it should be only used as a bluetooth receiver. The Pico2 has no wireless connectivity for now. But it's why I tried to position their integrated antenna away from each other.
 
I got the optical SPDIF from LG working well with Soundsync, outputing to SPDIF Coax.

The SPDIF input straight from the ESP32's GPIO pin doesn't work however. Also USB input only gives me half a sec of music or so, it's erratic.
 
I've got a couple of issues to report:

1) When my Pico power cycles all of the hardware port assignments revert to default. This can't be right. I have port settings not bound to presets and I'm not using the default ports for testing at the moment. So, I set the ports and it works and I click Save as necessary but then on a power cycle the ports are reverted and ...

2) I'm hoping to use SPDIF input and I'm currently using an optical receiver (DR2811 I think it is). I don't have a bypass capacitor on it but the signal looks good coming into the SPDIF input. However, it only works reliably at 16/48000. At 24/96000 it works kind of but there are a lot of dropouts. Should this be working? I'm using a Pico W 2 (2350) and piping from my I7 PC motherboard/sound optical output.

1779884662230.png

--24/96 signal view--

Thanks.

Also... I'm a bit confused by the volume settings. I change the Master volume with the console and it suggests that I save and says I've changed the User volume. What's up with that? Is there a new volume setting I'm missing?
 
Last edited:
I've got a couple of issues to report:

1) When my Pico power cycles all of the hardware port assignments revert to default. This can't be right. I have port settings not bound to presets and I'm not using the default ports for testing at the moment. So, I set the ports and it works and I click Save as necessary but then on a power cycle the ports are reverted and ...

2) I'm hoping to use SPDIF input and I'm currently using an optical receiver (DR2811 I think it is). I don't have a bypass capacitor on it but the signal looks good coming into the SPDIF input. However, it only works reliably at 16/48000. At 24/96000 it works kind of but there are a lot of dropouts. Should this be working? I'm using a Pico W 2 (2350) and piping from my I7 PC motherboard/sound optical output.

View attachment 535265
--24/96 signal view--

Thanks.

Also... I'm a bit confused by the volume settings. I change the Master volume with the console and it suggests that I save and says I've changed the User volume. What's up with that? Is there a new volume setting I'm missing?

In the settings there is an option to save pin assignments with presets. Do you have this enabled?
 
I've got a couple of issues to report:

1) When my Pico power cycles all of the hardware port assignments revert to default. This can't be right. I have port settings not bound to presets and I'm not using the default ports for testing at the moment. So, I set the ports and it works and I click Save as necessary but then on a power cycle the ports are reverted and ...

2) I'm hoping to use SPDIF input and I'm currently using an optical receiver (DR2811 I think it is). I don't have a bypass capacitor on it but the signal looks good coming into the SPDIF input. However, it only works reliably at 16/48000. At 24/96000 it works kind of but there are a lot of dropouts. Should this be working? I'm using a Pico W 2 (2350) and piping from my I7 PC motherboard/sound optical output.

View attachment 535265
--24/96 signal view--

Thanks.

Also... I'm a bit confused by the volume settings. I change the Master volume with the console and it suggests that I save and says I've changed the User volume. What's up with that? Is there a new volume setting I'm missing?
In order for pin assignments to be loaded at boot, the “include pin assignments when loading presets” setting needs to be enabled (it is by default unless changed) and your desired preset needs to be set as the default.

96KHz is not actively supported but will be patched in the next beta if possible. :)

Regarding master volume, please ensure that it is in the “global” mode.
 
In order for pin assignments to be loaded at boot, the “include pin assignments when loading presets” setting needs to be enabled (it is by default unless changed) and your desired preset needs to be set as the default.

96KHz is not actively supported but will be patched in the next beta if possible. :)

Regarding master volume, please ensure that it is in the “global” mode.

Thanks for the answers. Slight things...

a) It would be great if the online doc accurately portrayed the current status. The SPDIF doc claims support up to 192K. I don't mind that you aren't there but a note on what's implemented vs not would be a great timesaver.

b) I don't really get the 'load with presets' option. I assumed port settings were either globally saved or saved per preset. A setting with options of 'save the port settings' vs 'never save the port settings' seems obscure and not useful. Am I missing something here?
 
Thanks for the answers. Slight things...

a) It would be great if the online doc accurately portrayed the current status. The SPDIF doc claims support up to 192K. I don't mind that you aren't there but a note on what's implemented vs not would be a great timesaver.

b) I don't really get the 'load with presets' option. I assumed port settings were either globally saved or saved per preset. A setting with options of 'save the port settings' vs 'never save the port settings' seems obscure and not useful. Am I missing something here?
The SPDIF RX documentation does specify that 96KHz is supported but that higher sample rates are unsupported by the pipeline. I will be overhauling some of the main documentation and readme shortly, so this will be made clearer.

1779894503039.png


You are exactly correct. When the "load with presets" option is off, output settings are never saved. This option has existed since before my initial release and has been on the laundry list for some time. There was originally an architectural reason for it but that no longer applies.

What I want to do is bring it in line with the master volume mode control, whereby output settings can be saved either globally or per-preset. I agree that the current functionality is not particularly useful.
 
Back
Top Bottom