Advertising:

Snickerstream 3DS

From GameBrew

Snickerstream
Snickerstream2.png
General
AuthorRattletraPM
Last Updated2018/10/26
Type3DS Streaming
Version1.10
LicenseMixed
Links
Download
Website
Source

Snickerstream is a streaming client for Nintendo 3DS consoles. It's the first and currently only one that supports both NTR and HzMod (the two available homebrew apps for streaming) and that can also receive streams from multiple 3DS consoles to the same PC using NTR. Unlike other clients Snickerstream has been rewritten completely from scratch, allowing it to offer a ton more features with an extremely small resource footprint. Plus, most of said features are shared with both streaming apps so you can use whichever one you want while retaining all your settings.

Snickerstream's three main focuses are performance, customizability and feature-richness. If all you want to do is to set up a simple 3DS streaming environment then your usual NTR & HzMod settings are all there, or if you don't want to touch them at all you can even choose one of the built-in presets. However, if you're someone who wants to tweak every single variable and setting to get everything up and running just the way you want it to be, you'll definitely feel just at home in the advanced menu, or in the settings INI, if that's more your thing.

Note: As of version 1.10 HzMod support is still experimental and partially incomplete and only its latest version is supported. However game compatibility is almost flawless, only very few titles cannot be streamed using Snickerstream but can be using HorizonScreen.

Features

  • NTR supports:
    • Real time screen scaling.
    • Sevaral interpolation modes (improves the image quality especially if the window has been scaled).
    • Portable: no DLL files needed (keep in mind that kit-kat still uses DLLs, they just get extracted to a temporary directory).
    • Native x64 version for better performance on 64-bit computers.
    • Many screen layouts, such borderless fullscreen and separate windows for both screens.
    • Pop-up secondary screen for fullscreen layouts (press SPACEBAR).
    • More options that will make Snickerstream work better on crappy computers or networks.
    • Built-in screenshot function (press S while streaming to create a screenshot).
    • Built in NFC patching.
    • 7 different built-in remoteplay presets are available, with support for creating your own customized ones.
    • Automatic remoteplay init, you only need to click connect and Snickerstream will care about everything else.
    • Auto-disconnects if the 3DS has stopped streaming (was shutdown/rebooted/etc, can be customized or disabled).
    • Built-in frame limiter (disabled by default) if you wish to have a smoother stream.
    • It will try allow itself through Windows Firewall if ran as admin.
    • Toggable automatic screen centering for all layouts.
    • Customizable hotkeys.
    • Support for multiple NTR streaming to the same PC via NTR Patching.
  • HzMod supports:
    • Compatible with both New and Old 3DS models.
    • Can stream multiple consoles to the same PC out of the box, without the need to change the ports or patching the executable
    • Can change the stream's quality in real time (unlike NTR, which needs you to reboot your console in order to do that).
    • Does not crash when soft-resetting or when you exit out of a game.
    • Works in a much cleaner and stable manner.
    • Better game compatibility (games that must be streamed using TARGA are currently not supported but this is caused by incomplete support in Snickerstream, not HzMod itself).

User guide

NTR vs HzMod

Before you start, you should choose which homebrew streaming app you want to use: NTR or HzMod. Each have their own pros and cons but you'll be able to switch from one another in no time if you wish.

NTR is the default streaming app for Snickerstream but depending on your necessities you might find HzMod more useful and appropriate.

NTR Pros (left) and Cons (right)
Best performance. Can only stream on New 2/3DS systems.
Popular, lot of guides available in case something goes wrong. It's a bit hacky and it can crash or not work at all sometimes.
Can stream both screens at the same time (older versions of HzMod can do that too but Snickerstream only supports the latest one right now, which can only stream the top screen). It closes if you soft reset or exit from a game.
Supports NFC patching (some games force Wi-Fi to be off, in these cases you need to send a patch in order to stream them). Doesn't normally support streaming multiple 3DSes to the same PC and must be patched to do so.
- It works, but development has seemingly stopped some time ago.
HzMod Pros (left) and Cons (right)
Best compatibility. Worse performance than NTR, but it's still acceptable.
Works on both New and Old 2/3DS consoles. The current version (the only one supported by Snickerstream right now) only streams the top screen.
Much cleaner and less prone to crashing. Some games stream their frames using TARGA, which Snickerstream currently does not support).
Supports streaming multiple 3DSes to the same PC out of the box. Some games can experience slowdowns (you can tweak your settings to fix this, however).
Doesn't close when soft resetting or closing a game. Performance on old 3DS consoles is rather bad.
You can change the stream's quality in real time. Doesn't support NFC patching due to a bug (you can get around this on a New 2/3DS, but there's currently no way around it on old 3DS consoles).

Streaming with NTR

NTR is a true custom firmware which needs a bit more involvement when setting it up. It's not a stand-alone CFW like Luma3DS however, it basically runs alongside your CFW.

How to setup:

  • Download one of BootNTR Selector's CIA and install it with FBI.
  • Make sure your 3DS is connected to the internet, then launch BootNTR Selector.
  • The homebrew should ask you to select which paths it should use, select "Use default" then "Save settings".
  • Lastly, the app should ask which NTR version you want to use. Select 3.6 (the app will remember it from now on so you won't have to select it everytime).
  • The screen should flash blue and then you should be booted back to the Home menu. Make sure Snickerstream is connected on the same network as your PC, then launch Snickerstream.
  • Now it's time to customize the remoteplay settings. If you want to you could just enter your 3DS's IP address and either go with the default ones or use one of the built-in presets.
  • Once everything is in place, click Connect. You should see your 3DS' top screen flashing briefly, then the screens should start to be streamed to your PC.
  • (Optional) If a game tries to disable the Wi-Fi connection forcibly, you can either go back to the connection window (default hotkey: ENTER) and click on Send NFC patch or enable Luma3DS' debugger (open the Rosalina menu, go on Debugger options and Enable debugger).

Remoteplay setting options:

  • IP - You must write your 3DS' IP address here. You can find it from FBI > Remote install > Receive URLs over the network.
  • Screen priority - The screen that gets prioritized will get a higher framerate (Default: Top screen).
  • Priority factor - The higher the value, the better the prioritized screen's framerate will be (and the worse the non-prioritized one will get) A value of 1 will give both screens the same priority and a value of 0 will disable the non-prioritized screen completely (Default: 5).
  • Image quality - Setting this to a higher value will produce less compression artifacts but will make your framerate worse, and vice versa. It's not recommended to set it any higher than 90 as compression will always occur (even at the maximum = 100) while it's going to absolutely kill your framerate, while setting it below 50 will produce noticeable artifacts (Default: 70).
  • QoS Value - On supported routers it can give a nice framerate boost but most of the time it does nothing. Check this Wikipedia article to see commonly used values. A value of above 100 will disable this feature (Default: 20).

From now on all you have to do to stream your games is to open up NTR via BootNTR Selector and then launch Snickerstream. See this guide for multiple 3DS streaming with NTR.

Streaming with HzMod

HzMod support for Snickerstream is still considered experimental at this point but it should be reliable enough to stream most games with no issues. However, keep in mind that two key features are still missing, namely backwards compatibility with earlier HzMod/HorizonM versions and support for "TARGA” games (aka, a very small percentage of games that rely on a customized TARGA image format to be streamed).

How to setup:

  • You will need the AIO pack from HzMod. Make sure to follow this step if you've already used HzMod/HorizonM before as only the latest version is supported.
  • Install HorizonM.cia and HzLoad.cia on your console, and also HzLoad_HIMEM.cia if you're on an old 2/3DS.
  • Make sure your 3DS is connected to the internet, then launch HorizonM Loader (or HorizonM HIMEM Loader if you're on an old 2/3DS and you want to stream high memory games).
  • You should be booted back to the Home menu and the notification LED should be cyan. Make sure Snickerstream is connected on the same network as your PC, then launch Snickerstream.
  • On Other Settings (the right side of the window) click on the list box near Streaming app and select HzMod instead of NTR.
  • Now it's time to customize the remoteplay settings. If you want to you could just enter your 3DS's IP address and either go with the default ones or use one of the built-in presets.
  • Once everything is in place, click Connect You should see your 3DS' notification LED turn green, then the top screen should start to be streamed to your PC.
  • (Optional) If a game tries to disable the Wi-Fi connection forcibly you enable Luma3DS' debugger on a New 2/3DS (open the Rosalina menu, go on Debugger options and Enable debugger). There is sadly no workaround on an Old 3DS as of now.
  • (Optional) If your game gets slowdowns you might want to increase the Cap CPU cycles option or set a frame limit in the advanced menu.

Remoteplay settings options:

  • IP - You must write your 3DS' IP address here. You can find it from FBI > Remote install > Receive URLs over the network.
  • Image quality - Setting this to a higher value will produce less compression artifacts but will make your framerate worse, and vice versa. It's not recommended to set it any higher than 90 as compression will always occur (even at the maximum = 100) while it's going to absolutely kill your framerate, while setting it below 50 will produce noticeable artifacts. (Default: 70, but the recommended value is 42 as it'll give the best quality/framerate ratio).
  • Cap CPU cycles - If some games suffer from slowdowns while streaming, set this value to something high. A value of 256 however will make the system module wait until VSync, which is almost nothing on New 2/3DS (Default: 0).

From now on all you have to do to stream your games is to open up HzMod, wait for the cyan notification LED then launch Snickerstream.

Settings.ini

Snickerstream stores its settings in an INI file called settings.ini located in the same folder as the executable/Au3 script. The INI contains a single section called [Snickerstream] that stores all keys and their assigned values.

Snickerstream's settings can be divided into three groups: standard, advanced and interface settings. The Advanced section will also be very helpful if you wish to play around with the advanced menu.

Standard settings
IpAddr The (N)3DS’ IP. It must be a valid IPv4 address, separated by dots.
PriorityMode Boolean. Setting it to 0 will give priority to the top screen when streaming, otherwise setting it to 1 will give priority to the bottom screen. The default value is 0 (aka top screen).
PriorityFactor Sets how many of the prioritized screen’s frames will have to be streamed before one of the non-prioritized screen gets sent. Setting it to 1 will give the same priority to both screens, while setting it to 0 will completely disable the non-prioritized screen. The default value is 5.
ImageQuality Sets the frames’ quality value, ranging from 1 (worst) to 100 (best). NTR sends its frames as a stream of JPEG images which means that the frames will always get compressed, even if you set this variable to 100. Therefore it is not recommended to set ImageQuality to any value above 95 as the stream will consume a lot more bandwidth while compression artifacts may still be visible. The default value is 70.
QoS Sets the UDP packets’ Quality of Service value. Refer to this table to see the commonly used DSCP values (see the decimal value column). The default value is 20. When using HzMod this variable is used for the Cap CPU Cycles setting and its default value is 0.
Interpolation Sets the interpolation mode used by the rendering backend. Direct2D and GDI+ support different interpolation modes so this setting will have to be changed if you switch between the two (Snickerstream’s GUI will do this automatically). Direct2D has six interpolation modes: Nearest neighbor (0), Linear (1), Cubic (2), Bicubic (3), Multi Sample Linear (4), Anisotropic (5) and High Quality Bicubic (6), while GDI+ has Default (0), Low quality (1), High quality (2), Bilinear (3), Bicubic (4), Nearest-neighbor (5), Bilinear HQ (6) and Bicubic (7). The default value is 0.
Layoutmode Sets which screen layout will be used when streaming. The accepted values are 0 (Vertical), 1 (Vertical, inverted), 2 (Horizontal), 3 (Horizontal, inverted), 4 (Top only), 5 (Bottom only), and 6 (Fullscreen, top only). The default value is 0.
UseNTR Boolean. Specifies whether to use NTR (True) or HzMod (False) as the streaming homebrew app. Default: True.
Advanced settings
Loglevel Sets the current log level (and thus also specifies whether to create a log file or not). There are three log levels: 1 (only logs basic information), 2 (logs some more in-depth stuff, such as current settings and invalid packet errors) and 3 (logs everything). Setting the log level to 3 will produce very long log files and, as such, should only be used for debugging purposes. Setting this variable to 0 or lower will make Snickerstream not produce a log file, while setting it to anything higher than 3 will have the same effect as log level 3. This variable is set to 0 by default.
LogConsole Specifies whether to output the log to a file (0), a console window (1) or both (2). Default: 0.
ListenPort Sets what UDP port should Snickerstream listen to when streaming using NTR. Default: 8001.
UseD2D Boolean. If set to True then Snickerstream will use Direct2D as its rendering backend, while if it’s set to False then GDI+ will be used instead. The GDI+ renderer has been deprecated and should not be used unless you really know what you're doing.
PCIpAddr Binds Snickerstream to one of the IP addresses assigned to the computer. Useful in some situations (such as if UDP port 8001 is open on your router but you only want to listen to local connections for security reasons) but will make you unable to stream if set incorrectly. This variable is unset by default and Snickerstream will listen on all available network interfaces.
WaitRemoteplayInit This variable specifies how many milliseconds Snickerstream will wait for a frame to be sent before sending the remoteplay packet. If a frame is received during that time span it means that remoteplay has already been started, so there will be no need to send the packet again and the client can receive frames right away. Setting this variable to a value too high will make Snickerstream take too much to connect to the (N)3DS for the first time, while setting it too low might make it take a bit longer for any subsequent connection. Setting it to 0 or a negative value will always make Snickerstream send the remoteplay packet. The default value is 1000 (1 second).
Framelimit If set, enables Snickerstream’s experimental frame limiter feature which locks the stream to the specified framerate. Useful if you prefer a smooth stream over having a high but unstable framerate, howerer setting this value too low will make your stream laggy. This value is unset by default (the recommended value is 30).
ReturnAfterMsec Specifies how many milliseconds will have to pass without receiving a frame before Snickerstream returns to the connection window. Useful if you reboot your (N)3DS frequently. Setting it to 0 or a negative value will disable this feature. Setting this variable to a value too small might make Snickerstream disconnect too frequently, so it should be used with caution. Snickerstream waits 8000 milliseconds (8 seconds) by default but this variable is not set when the INI is first created.
CenterScreens If set to 1 it will center the screens inside the streaming window, otherwise the screens will be aligned to the left side of the window. Default: 1.
Hotkeys A series of 10 key codes separated by a vertical line that define which action should be run when a specific button is pressed. The first one is assigned to the SCALE UP action, then going on there is SCALE DOWN, PERV. INTERP., NEXT INTERP., RETURN WINDOW, SCREENSHOT, SCREEN POPUP, CLOSE, HZM QUALITY-, HZM QUALITY+. You can find a list of compatible keycodes here but keep in mind that you can always bind them from the advanced menu if you don't want to bother with doing that manually by editing the INI. Also note that if the string doesn't contain exactly 10 key codes it will be automatically reset to the default ones. Default: 26|28|25|27|0D|53|20|1B|51|45
EnableHzMNFCPatch This option is here only for forwards compatibility. Boolean. As of writing this article NFC patching in HzMod is broken and it will result in a softlock when games try to enable NFC. This is a bug within HzMod itself and will require an update to that homebrew app in order for it to be fixed. Althrough it doesn't cause any permanent damage to the console it's suggested to leave this option disabled until an update is released that fixes this issue. Default: False.
TopScalingFactor and BottomScalingFactor Self-explainatory, if set to anything other than 0 it will scale the respective screen by the specified factor (must be higher than 0.3). Default for both: 0.
CustomWidth and CustomHeight Workarounds for high DPI monitors whose settings are not automatically detected by Snickerstream. You can set the streamin window's initial size (in pixels) by adding these variables to the INI. Keep in mind that CustomWidth must be higher than 150, CustomHeight must be higher than 200 and that the window's content WILL NOT BE SCALED when setting a custom size using these variables. Default for both: 0.
CustomWidth2 and CustomHeight2 Same as above but they're used for the bottom screen window when using the separate windows layout.
Interface settings
NFCLastAnswer Stores the value returned by the message box asking which version of the NFC patch must be sent. The accepted values are 6 (>=11.4) and 7 (<=11.3). Bug: Setting this to anything else will make the Send NFC button do absolutely nothing. This variable only gets set when the Send NFC button gets pressed and is unset by default.
NoDisplayIPWarn By default, Snickerstream warns the user if PCIpAddr is set to a specific value in the INI file (mostly because in the PoC version it was set to the PC’s first network adapter’s IP which could cause problems if you have multiple ones). If set, this warning will not appear.
DontCheckSettings By default, Snickerstream warns the user if the remoteplay settings he chose aren’t good for the screen layout he decided to use – such as giving priority to the bottom screen and setting the screen layout to top only. If set, Snickerstream will not check the settings when connecting to the (N)3DS and the warning will not appear.
GDIPWarn When switching from Direct2D to GDI+ Snickerstream will warn the user that this rendering backend is deprecated. If set, this warning will not appear.
AdvWarning When the user first enters the Advanced menu a warning will appear basically saying "here be dragons". If set, this warning will not appear.
DontCheckForUpdates If set to a value different than 0 the update warner feature will be disabled completely. This feature can also be disabled by clicking on "Cancel" when the update warner asks the user if he wants to go to the GitHub releases page.

Troubleshooting

I get a black screen, a "Could not start remoteplay" or "Could not receive the stream from your console" error when using NTR.

This usually happens if a firewall, antivirus or an external program is preventing Snickerstream from receiving the stream. Double check that your IP is correct, then whitelist Snickerstream in both your antivirus and firewall (optionally, if you run Snickerstream as admin it will try to allow itself through Windows Firewall).

For the love of all that is holy, do not disable either your firewall or antivirus. Not only you'd be putting yourself in unnecessary risk but Windows Firewall is sometimes known for reactivating itself for no reason. Instead, take the time to properly configure things.

If the issue still persists, try to connect using Snickerstream first, then switch to NTRViewer from the NTR starter kit and see if the stream works. If it doesn't, it's not Snickerstream's fault and it's a problem on your end. If nothing seems to work, you can try using HzMod instead of NTR.

My custom settings don't get saved.

If that happens then Snickerstream doesn't have write permissions for the folder it's currently in. You could either move Snickerstream to a path for which your account has write permissions (for example, a folder on your desktop) or take ownership of that folder.

The stream's framerate is poor.

This is generally caused either by poor Wi-Fi signal strenght or interference. If the first one's your problem try to either place your 3DS closer to your access point (remember, you could always use input redirection if the console is too far from you) or to create an ad-hoc network closer to it, while if it's the second try to change your Wi-Fi channel. Alternatively, you can always drop the stream's quality a notch or increasing the priority value (remember to restart your 3DS afterwards if you're using NTR).

The connection gets dropped after opening a certain game.

If a game uses NFC connectivity it'll try to forcefully disable Wi-Fi. This can be circumvented using NTR by either returning to the Home menu and clicking Send NFC patch in Snickerstream or enabling Luma3DS' debugger (open Rosalina, go to Debugger options, Enable debugger). NFC patching is currently broken in HzMod but you can still enable Luma's debugger on a n3/2DS. There's currently no option to do that on old 3DS consoles.

Switching games or soft resetting causes the 3DS to softlock while using NTR.

This is an issue caused by NTR and cannot be fixed. Use HzMod if you need either.

Weird colours appear when streaming Virtual Console titles with NTR.

That's yet another issue caused by NTR. One workaround would be to use homebrew emulators instead and another would be to use HzMod instead (but keep in mind that a lot of VC games require TARGA support, which is currently not implemented in Snickerstream - more on that in the next point).

I get an error saying "Snickerstream currently does not support TARGA streams" while trying to stream a game with HzMod.

Some games require a different format to stream their frames with HzMod. This format is not yet supported in Snickerstream but it will be in future versions. For now you'll either have to use NTR or the official HorizonScreen client instead.

DS/GBA games and VC titles cannot be streamed.

They cannot be streamed because the 3DS unloads the entire OS while opening one of said games, including NTR and HzMod, then the respective console's firmware gets loaded instead and runs natively on the hardware. In other words, they cannot be streamed and this probably won't ever change either.

I get an error saying “There was an error while initializing Direct2D.

The Direct2D renderer will only work on Windows 7 and later. If you're using Windows 7 then you must have the platform update installed, which is free and you can either install it from Windows Update or separately from Microsoft's website. Keep in mind that it requires the Service Pack 1 to be already installed. If you're on XP or Vista then you can still use the (deprecated) GDI+ renderer, even if you'll be missing out on some features. If you're on an earlier version of Windows then you're out of luck...maybe it's time for an upgrade?

FAQ

Please see Snickerstream's FAQ section.

Controls

Esc - Close Snickerstream (or right-click the tray icon and select Exit)

Up/Down - Increase/Decrease scaling

Left/Right - Change interpolation settings

S - Take a screenshot

Enter - Go back to the connection window

Spacebar - Pop up the other screen (can only be done in fullscreen modes)

S/D - Increase/Decrease streaming quality (HzMod only)

Screenshots

snickerstream3.png

Media

Snickerstream Vlog #2 v1 0 Sneak peek & NTRRemoteplaySimulator release (by RattletraPM)

Changelog

v1.10

New features:

  • Initial HzMod support. This alone should warrant a paragraph of its own, but for shortness' sake check the full details on the Wiki for its pros and cons against NTR.
  • The Direct2D renderer has been updated from D2D v1.0 to v1.1. This was mainly required for HzMod support but it also bumped up the interpolation mode count from 2 to 6.
  • A function to remap the hotkeys without having to edit the INI file manually has been added to the advanced menu.
  • More logging options: you can now log to a file, a console window or both. * Also, logging at loglevel 3 is a little less spammy now.

Improvements & Bug fixes:

  • The renderer combobox has been moved to the advanced menu. The streaming app selection takes its old place. This marks the official deprecation of the GDI+ renderer.
  • Snickerstream no longer your logs CPU and GPU model. The function being used was a bit of a mess and caused crashes at startup in some very rare cases – just two recorded ones, if you're being curious. Considering that this info was rarely needed for troubleshooting after adding Direct2D support, just decided to remove it altogether.
  • Fixed some typos.
  • Slightly made the source code better to look at. Just slightly.
  • [Bugfix] You can now specify a custom width & height (DPI fix) for the bottom screen window in separate windows mode.
  • [Bugfix] The default hotkeys will now be restored if an invalid number of hotkeys is found in settings.ini instead of being simply refusing to read them.
  • [Bugfix] Fixed a bug affecting real time screen scaling in GDI+.
  • [Bugfix] Top and bottom scaling factor inputs in the adv menu aren't limited only to decimal chars anymore (so you can now enter dots).

Credits

Written by RattletraPM in AutoIt v3.

Tested by Roman Sgarz and Silly Chip. Snickerstream uses the Direct2D and WIC UDFs written by trancexx and Eukalyptus.

HzMod made by Sono, who also helped with adding HzMod support to Snickerstream.

External links