NrealAir
Friday 6 January 2023

#VR #Devices

I recieved my Nreal Air Thursday 08 2022. Imported from US as it’s not sold yet in Germany. Bought from Amazon US (amazon.com).

Tech inspection

Connected the device with the provided USB-C cable to my laptop (hardware). the operating system is Arch Linux (xserver+i3).

Device

lsusb output lists 3 additional devices

Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 3318:0424 Nreal Nreal Air
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

getting more information about the device

lsusb -s 003:002 -v

Bus 003 Device 002: ID 3318:0424 Nreal Nreal Air
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x3318
  idProduct          0x0424
  bcdDevice            0.01
  iManufacturer           1 Nreal
  iProduct                2 Nreal Air
  iSerial                 3 A00011:14:14
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0121
    bNumInterfaces          6
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0
      iInterface              0
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength       0x0047
        bInCollection           2
        baInterfaceNr(0)        1
        baInterfaceNr(1)        2
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             1
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bNrChannels             2
        wChannelConfig     0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames           0
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 2
        bSourceID               1
        bControlSize            1
        bmaControls(0)       0x03
          Mute Control
          Volume Control
        bmaControls(1)       0x00
        bmaControls(2)       0x00
        iFeature                0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             3
        wTerminalType      0x0402 Headset
        bAssocTerminal          4
        bSourceID               2
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             4
        wTerminalType      0x0402 Headset
        bAssocTerminal          3
        bNrChannels             1
        wChannelConfig     0x0001
          Left Front (L)
        iChannelNames           0
        iTerminal               0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 5
        bSourceID               4
        bControlSize            1
        bmaControls(0)       0x03
          Mute Control
          Volume Control
        bmaControls(1)       0x00
        iFeature                0
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID               5
        iTerminal               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           1
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                11
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             2
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            1 Discrete
        tSamFreq[ 0]        48000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes           13
          Transfer Type            Isochronous
          Synch Type               Synchronous
          Usage Type               Data
        wMaxPacketSize     0x00c0  1x 192 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         2 Decoded PCM samples
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0
      iInterface              0
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           6
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                11
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             1
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            1 Discrete
        tSamFreq[ 0]        48000
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes           13
          Transfer Type            Isochronous
          Synch Type               Synchronous
          Usage Type               Data
        wMaxPacketSize     0x0068  1x 104 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x00
          bLockDelayUnits         2 Decoded PCM samples
          wLockDelay         0x0000
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      27
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x05  EP 5 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        4
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      27
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x86  EP 6 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x07  EP 7 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        5
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      27
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x88  EP 8 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x09  EP 9 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               1

Screen

Xrandr output:

DP1 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +

I can turn it on using xrandr from terminal or from arandr GUI. it supports only one mode with one resolution and one refresh rate.

DP1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 120mm x 70mm
   1920x1080     60.00*+

what does the eDID look like

hexdump -C /sys/class/drm/card0-DP-1/edid
00000000  00 ff ff ff ff ff ff 00  3a 4c 32 31 00 88 88 88  |........:L21....|
00000010  08 1c 01 03 80 0c 07 78  0a 0d c9 a0 57 47 98 27  |.......x....WG.'|
00000020  12 48 4c 00 00 00 01 01  01 01 01 01 01 01 01 01  |.HL.............|
00000030  01 01 01 01 01 01 98 3a  80 50 70 38 aa 40 20 10  |.......:.Pp8.@ .|
00000040  95 00 80 38 74 00 00 1e  98 3a 80 50 70 38 aa 40  |...8t....:.Pp8.@|
00000050  20 10 95 00 80 38 74 00  00 1e 00 00 00 fd 00 32  | ....8t........2|
00000060  82 14 3c 3c 00 0a 20 20  20 20 20 20 00 00 00 fc  |..<<..      ....|
00000070  00 6e 72 65 61 6c 20 61  69 72 0a 20 20 20 00 5e  |.nreal air.   .^|
00000080

Audio device

I’m a bit surprised as pulseaudio doesn’t see the device! and can’t find it in Pavucontrol

 ➜  cat /proc/asound/cards
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xec340000 irq 140

Pictures

Couple things to note:

  • in the picture the display looks curved. in reality it’s straight not curved.
  • in the pictures it appears out of focus. in reality some parts of the picture (mainly far corners) feels out of focus the rest if fine. and I found it changes when you move the device moves up or down.

How does it work?

From what I’m seeing.

  • there is a small display at the top for each eye
  • the display is horizontal facing down
  • the top of the screen is near my eyes so rotating the glasses away from you makes the display in the correct orientation
  • there is a glass from top near the eye bottom away to the edge fo glasses bottom. I guess this reflects the screen from one side. (one way mirror)
  • the image falls on another glass infront of your eyes.

How does it feel?

When looking at the displayed picture it feels really large looking at the ceiling with it feels like the cinema display. my eyes moves the same way to focus. with the center feels more focused and the edges and corners abit out of focus. my eye needs to move to look at the corners.

Devices

  • Worked out of the box with Valve Steam deck
  • Worked with my laptop
  • Didn’t work with my PC (same OS setup). as I connected it to the front USB-C of a lenovo usb dock. I guess I’ll need HDMI to usbc adapter.

Software

  • Nebula is available for mac os https://www.nreal.ai/nebula

  • I tried it on a Macbook pro M1 machine. it’s a simple application where you can select if it’s:

    • 1, 2, 3 screens.
    • how far are they close, medium, far
    • reset their position to face you in case your orientation changed
  • I wanted to know what’s inside it. downloaded it and extracted the dmg

pacman -S p7zip
7z x nebula.dmg
  • the file structure
.
├── Applications
├── [HFS+ Private Data]
└── Nebula for Mac.app
    └── Contents
        ├── CodeResources
        ├── _CodeSignature
        │   └── CodeResources
        ├── Frameworks
        │   ├── GameAssembly.dylib
        │   └── UnityPlayer.dylib
        ├── Info.plist
        ├── MacOS
        │   └── Nebula
        ├── PlugIns
        │   ├── lib_burst_generated.bundle
        │   ├── libew.bundle
        │   │   └── Contents
        │   │       ├── _CodeSignature
        │   │       │   └── CodeResources
        │   │       ├── Info.plist
        │   │       ├── MacOS
        │   │       │   └── libew
        │   │       └── Resources
        │   │           ├── default.metallib
        │   │           ├── SettingViewController.nib
        │   │           └── TmpWindow.nib
        │   ├── libnr_api.dylib
        │   ├── libota.dylib
        │   ├── libth.bundle
        │   │   └── Contents
        │   │       ├── _CodeSignature
        │   │       │   └── CodeResources
        │   │       ├── Info.plist
        │   │       ├── MacOS
        │   │       │   └── libth
        │   │       └── Resources
        │   │           └── SensorsAnalyticsSDK.bundle
        │   │               ├── sa_autotrack_gestureview_blacklist.json
        │   │               ├── sa_autotrack_viewcontroller_blacklist.json
        │   │               ├── sa_mcc_mnc_mini.json
        │   │               ├── sa_visualized_path.json
        │   │               ├── sensors_analytics_flow.json
        │   │               ├── sensors_analytics_node.json
        │   │               ├── sensors_analytics_task.json
        │   │               └── zh-Hans.lproj
        │   │                   └── Localizable.strings
        │   └── libvdh.bundle
        │       └── Contents
        │           ├── _CodeSignature
        │           │   └── CodeResources
        │           ├── Info.plist
        │           ├── MacOS
        │           │   └── libvdh
        │           └── Resources
        │               ├── Assets.car
        │               └── MenuBarViewController.nib
        └── Resources
            ├── Data
            │   ├── app.info
            │   ├── boot.config
            │   ├── globalgamemanagers
            │   ├── globalgamemanagers.assets
            │   ├── globalgamemanagers.assets.resS
            │   ├── il2cpp_data
            │   │   ├── Metadata
            │   │   │   └── global-metadata.dat
            │   │   └── Resources
            │   │       ├── mscorlib.dll-resources.dat
            │   │       ├── Newtonsoft.Json.dll-resources.dat
            │   │       └── System.Data.dll-resources.dat
            │   ├── level0
            │   ├── level0.resS
            │   ├── Resources
            │   │   └── unity_builtin_extra
            │   ├── resources.assets
            │   ├── resources.assets.resS
            │   ├── RuntimeInitializeOnLoads.json
            │   ├── ScriptingAssemblies.json
            │   ├── sharedassets0.assets
            │   ├── sharedassets0.assets.resS
            │   └── StreamingAssets
            │       └── UnityServicesProjectConfiguration.json
            ├── DefaultPreferences.plist
            ├── MainMenu.nib
            │   ├── designable.nib
            │   └── keyedobjects.nib
            ├── PlayerIcon.icns
            └── unity default resources

32 directories, 56 files

Some notes:

  • I see Unity library in the frameworks directory

Using it

For gaming with Steam deck

  • It worked without any manual steps. when connected it will turn on the audio will come out of it’s speakers
  • Played “Skull - the hero slayer” couple times
    • The longest and last session (30 minutes) caused pain in the back of my eyes and dizziness
    • The screen is too near the eye that I can’t see all of it. adjusting it to see the top will push the bottom out of the view
    • Corners were too out of focus that I can’t see the bottom left corner clear enough (the health bar)
  • Watched youtube video on chrome it was nice I liked this use case
  • Tried to watch anime from crunchy roll on google chrome. worked nicely too. but subtitle was glowing too much like a case of astigmatism.

With Nebula + Macbook pro M1

  • The software is beta
  • It’s impressive to see multiple screens suspended in the air
  • screens are vibrating (pulsating) I think it correlates with my blood pulse. (same happened with me and my wife experiment)

With Lenovo thinkpad X1 carbon laptop

  • Speaker didn’t work, wansn’t detected
  • No software to switch mode to multiple screens so I was stuck with one screen near my face like steam deck.
  • The screen is too out of focus in the corners so I can’t see the window title, the command prompt when I have full screen terminal.
  • Text is glowing. like having an extreme case of astigmatism. can’t use it for coding

With my phone

  • One plus nord phone is not supported. so I can’t install the app.
  • I think it’s a hardware problem my phone lakes a feature needed for external screens

Returning it

  • I decided to return it
  • From all the use cases the only one that works for me is watching videos on steam deck. all other usecases are too problematic
  • After having that headache and dizziness I’m afraid of using it again.

See Also