Git Product home page Git Product logo

roc-droid's People

Contributors

belchingjalapeno avatar fallingcats avatar gavv avatar githubashutoshsoni avatar jamesosborn-se avatar linalinn avatar maximeborges avatar ortex avatar paupau-cor avatar poussinou avatar valeryhime avatar zopieux avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

roc-droid's Issues

Grab sound from other apps

In #5 we've implemented recording from mic and sending to remote sender. It would be also nice to be able to grab sound played by other apps on phone instead of reading it from mic. It should be feasible using playback capture API introduced in Android 10.

Android TV support ?

Has anybody tried this on Android TV ?
Currently I stream pulseaudio-dlna but ROC seems like a better option.

The main issues that come up tend to be: ensuring an icon can appear on the TV homescreen (these are a bit different to the ones on phones and tablets).

Adjusting the manifest so Google Play knows this works on TVs.

Ensuring the UI works sensibly with cursor keys and enter (on a remote this is the up/down/left/right and the OK button), there is also a back button.

App crashing on sender start while running on the emulator

It worked fine earlier, but now crashing for both apk with the new design and apk from last github release. I've created new emulator but it did't help.

Works fine with real devices.

That's what I have in the logs

01-27 13:10:02.953  1404  1442 I PeriodicStatsRunner: PeriodicStatsRunner.call():180 call()
01-27 13:10:02.953  1404  1442 I PeriodicStatsRunner: PeriodicStatsRunner.call():184 No submit PeriodicStats since input started.
01-27 13:10:04.984  7024  7024 D [rocdroid.SenderReceiverService]: Checking If Sender Alive
01-27 13:10:04.984  7024  7024 D [rocdroid.fragment.SenderFragment]: Starting Sender
01-27 13:10:04.987  7024  7024 D [rocdroid.SenderReceiverService]: Prestart Sender
01-27 13:10:04.987  7024  7024 D [rocdroid.SenderReceiverService]: Checking If Receiver Alive
01-27 13:10:04.987  7024  7024 D [rocdroid.SenderReceiverService]: Starting Foreground Service for Sender 
01-27 13:10:04.987  7024  7024 D [rocdroid.SenderReceiverService]: Building Notification for Sender 
01-27 13:10:04.990   531  2533 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:04.991   531  2533 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:04.991  7024  7024 D [rocdroid.SenderReceiverService]: Getting Notification Content Text
01-27 13:10:04.998   531  2533 W ActivityManager: Unable to start service Intent { cmp=com.android.systemui/.media.MediaProjectionPermissionActivity } U=0: not found
01-27 13:10:05.001   531  2533 I ActivityTaskManager: START u0 {cmp=com.android.systemui/.media.MediaProjectionPermissionActivity} from uid 10153
01-27 13:10:05.001   531   572 D EventSequenceValidator: Transition from INTENT_FAILED to INTENT_STARTED
01-27 13:10:05.008   428   428 I perfetto: ing_service_impl.cc:758 Configured tracing session 17, #sources:1, duration:5000 ms, #buffers:1, total buffer size:4096 KB, total sessions:1, uid:1071 session name: ""
01-27 13:10:05.008   427   427 I perfetto: probes_producer.cc:230  Ftrace setup (target_buf=17)
01-27 13:10:05.008   531   572 D EventSequenceValidator: Transition from INTENT_STARTED to ACTIVITY_LAUNCHED
01-27 13:10:05.018   531  3163 W ActivityTaskManager: Tried to set launchTime (0) < mLastActivityLaunchTime (602962)
01-27 13:10:05.019   531  3163 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.020   531  3163 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.021   531  3163 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:05.060   427   427 I perfetto: ftrace_procfs.cc:176    enabled ftrace
01-27 13:10:05.048     0     0 W perfetto: enabled ftrace
01-27 13:10:05.137   321  7001 D goldfish-address-space: claimShared: Ask to claim region [0x3ef330000 0x3efb42000]
01-27 13:10:05.143   321  7001 D goldfish-address-space: claimShared: Ask to claim region [0x3ec000000 0x3ec812000]
01-27 13:10:05.144   531  3163 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:05.147   321  7001 D goldfish-address-space: claimShared: Ask to claim region [0x3f2520000 0x3f2d32000]
01-27 13:10:05.160   321  7001 D goldfish-address-space: claimShared: Ask to claim region [0x3efb42000 0x3efb43000]
01-27 13:10:05.166   321  7001 D goldfish-address-space: claimShared: Ask to claim region [0x3efb43000 0x3efb44000]
01-27 13:10:05.167   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3efb44000 0x3efb45000]
01-27 13:10:05.176   531   572 D EventSequenceValidator: Transition from ACTIVITY_LAUNCHED to ACTIVITY_FINISHED
01-27 13:10:05.177   531   577 D ArtManagerInternalImpl: /data/misc/iorapd/com.android.systemui/30/com.android.systemui.media.MediaProjectionPermissionActivity/compiled_traces/compiled_trace.pb doesn't exist
01-27 13:10:05.182   531   577 I ActivityTaskManager: Displayed com.android.systemui/.media.MediaProjectionPermissionActivity: +170ms
01-27 13:10:05.198   531   531 D NotificationService: 0|org.rocstreaming.rocdroid|1|null|10153: granting content://settings/system/notification_sound
01-27 13:10:05.199   531   531 I chatty  : uid=1000(system) Binder:531_3 identical 2 lines
01-27 13:10:05.199   531   531 D NotificationService: 0|org.rocstreaming.rocdroid|1|null|10153: granting content://settings/system/notification_sound
01-27 13:10:05.201   531   531 W NotificationHistory: Attempted to add notif for locked/gone/disabled user 0
01-27 13:10:05.211   757   757 D InterruptionStateProvider: No bubble up: not allowed to bubble: 0|org.rocstreaming.rocdroid|1|null|10153
01-27 13:10:05.213   757   757 D InterruptionStateProvider: No heads up: unimportant notification: 0|org.rocstreaming.rocdroid|1|null|10153
01-27 13:10:05.215   531   572 D CompatibilityChangeReporter: Compat change id reported: 136219221; UID 10153; state: DISABLED
01-27 13:10:06.658   531  2535 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.660   757  1108 D OpenGLRenderer: endAllActiveAnimators on 0xb20d42b0 (RippleDrawable) with handle 0xb751c130
01-27 13:10:06.674   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3f2d32000 0x3f3632000]
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.693   531  2535 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.694   531  2535 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:06.701  7024  7024 D [rocdroid.SenderReceiverService]: Starting Sender
01-27 13:10:06.708  7024  7070 D [rocdroid.SenderReceiverService]: Creating Audio Record
01-27 13:10:06.711   395   484 D AudioFlinger: ro.audio.silent is ignored since no output device is set
01-27 13:10:06.712   307   501 E android.hardware.audio.service.ranchu: device/generic/goldfish/audio/util.cpp:checkAudioConfig:138 failure: false
01-27 13:10:06.712   307   501 E android.hardware.audio.service.ranchu: PrimaryDevice::getInputBufferSize:90 failed
01-27 13:10:06.712   307   501 E android.hardware.audio.service.ranchu: device/generic/goldfish/audio/primary_device.cpp:getInputBufferSize:91 failure: Result::INVALID_ARGUMENTS
01-27 13:10:06.712   307   501 E android.hardware.audio.service.ranchu: device/generic/goldfish/audio/util.cpp:checkAudioConfig:138 failure: false
01-27 13:10:06.712   307   501 E android.hardware.audio.service.ranchu: PrimaryDevice::getInputBufferSize:90 failed
01-27 13:10:06.713   307   501 E android.hardware.audio.service.ranchu: device/generic/goldfish/audio/primary_device.cpp:getInputBufferSize:91 failure: Result::INVALID_ARGUMENTS
01-27 13:10:06.713  7024  7070 D [rocdroid.SenderReceiverService]: Creating Playback Record
01-27 13:10:06.715   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.716   531  2533 I AS.AudioService: registerAudioPolicy for android.os.BinderProxy@a9e4ec8 with config:android.media.audiopolicy.AudioPolicyConfig@ab8e10c7
01-27 13:10:06.716   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.716   395  5934 D APM_AudioPolicyMix: registerMix(): adding mix for dev=0x8000 addr=-1416752953:ap:4mixp:0
01-27 13:10:06.718   307   496 D r_submix: adev_open_input_stream(addr=-1416752953:ap:4mixp:0)
01-27 13:10:06.718   307   496 D r_submix: submix_audio_device_create_pipe_l(addr=-1416752953:ap:4mixp:0, idx=9)
01-27 13:10:06.718   307   496 D r_submix:   now using address -1416752953:ap:4mixp:0 for route 9
01-27 13:10:06.729   395  7071 I AudioFlinger: AudioFlinger's thread 0xed6e2030 tid=7071 ready to run
01-27 13:10:06.729   307   496 I r_submix: in_standby()
01-27 13:10:06.731   307   496 I r_submix: in_standby()
01-27 13:10:06.734   531  3567 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.735   531  3567 I chatty  : uid=1000(system) Binder:531_1E identical 2 lines
01-27 13:10:06.785   531  3567 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.786   531  2535 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.786   531  2535 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.786   307   496 D r_submix: adev_close_input_stream()
01-27 13:10:06.786   307   496 D r_submix: submix_audio_device_release_pipe_l(idx=9) addr=-1416752953:ap:4mixp:0
01-27 13:10:06.786   307   496 D r_submix: submix_audio_device_destroy_pipe_l(): pipe destroyed
01-27 13:10:06.786   531  2535 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.787   395  5934 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:06.787  7024  7070 V AudioPolicy: Null context, checking permission via ActivityManager
01-27 13:10:06.789   531   531 I Telecom : WiredHeadsetManager: ACTION_HEADSET_PLUG event, plugged in: false, : WHC.oADA@AMg
01-27 13:10:06.787   395  5934 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:06.790  7024  7070 V android.media.AudioRecord: Will record from REMOTE_SUBMIX at full fixed volume
01-27 13:10:06.792   395   395 D APM_AudioPolicyMix: getInputMixForAttr found addr=-1416752953:ap:4mixp:0 dev=0x8000
01-27 13:10:06.792   307   496 D r_submix: adev_open_input_stream(addr=-1416752953:ap:4mixp:0)
01-27 13:10:06.792   307   496 D r_submix: submix_audio_device_create_pipe_l(addr=-1416752953:ap:4mixp:0, idx=9)
01-27 13:10:06.792   307   496 D r_submix:   now using address -1416752953:ap:4mixp:0 for route 9
01-27 13:10:06.794   395  7074 I AudioFlinger: AudioFlinger's thread 0xed6e2030 tid=7074 ready to run
01-27 13:10:06.794   307   496 I r_submix: in_standby()
01-27 13:10:06.795   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.795   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.796   307   496 I r_submix: in_standby()
01-27 13:10:06.797   531  3567 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.811   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.813   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.817   395   395 I AudioFlinger: openOutput() this 0xeb287600, module 18 Device type:0x8000,@:-1416752953:ap:4mixp:0, SamplingRate 44100, Format 0x000005, Channels 0x3, flags 0
01-27 13:10:06.817   307   496 D r_submix: adev_open_output_stream(address=-1416752953:ap:4mixp:0)
01-27 13:10:06.817   307   496 D r_submix: submix_audio_device_create_pipe_l(addr=-1416752953:ap:4mixp:0, idx=9)
01-27 13:10:06.817   307   496 D r_submix:   now using address -1416752953:ap:4mixp:0 for route 9
01-27 13:10:06.818   395   395 I AudioFlinger: HAL output buffer size 1024 frames, normal sink buffer size 1024 frames
01-27 13:10:06.818   395   395 E AudioFlinger: Failed to add event callback
01-27 13:10:06.820   395  7076 I AudioFlinger: AudioFlinger's thread 0xed4b5030 tid=7076 ready to run
01-27 13:10:06.821   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.821   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.822   395  7076 D AudioFlinger: ro.audio.silent is ignored since no output device is set
01-27 13:10:06.822   307   496 I r_submix: out_standby()
01-27 13:10:06.823   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.824   531   843 I chatty  : uid=1000(system) Binder:531_7 identical 1 line
01-27 13:10:06.825   531   843 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:06.825   395  7076 D AudioFlinger: ro.audio.silent is ignored since no output device is set
01-27 13:10:06.881   395  7076 D AudioFlinger: ro.audio.silent will be ignored for threads on AUDIO_DEVICE_OUT_REMOTE_SUBMIX
01-27 13:10:06.887   307   496 E android.hardware.audio.service.ranchu: device/generic/goldfish/audio/primary_device.cpp:getParameters:234 failure: Result::NOT_SUPPORTED
01-27 13:10:06.888   395   395 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:06.888   395   395 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:06.891   307   496 E FMQ     : grantorIdx must be less than 3
01-27 13:10:06.891   531  3567 I AudioService.RecordingActivityMonitor: rec update riid:63 uid:10153 session:49 src:REMOTE_SUBMIX pack:org.rocstreaming.rocdroid
01-27 13:10:06.891   307   496 E FMQ     : grantorIdx must be less than 3
01-27 13:10:06.891   395  7074 E FMQ     : grantorIdx must be less than 3
01-27 13:10:06.892   395  7074 E FMQ     : grantorIdx must be less than 3
01-27 13:10:06.894   531   843 W AS.AudioService: Trying to call forceRemoteSubmixFullVolume() without CAPTURE_AUDIO_OUTPUT
01-27 13:10:06.898   531   531 I Telecom : WiredHeadsetManager: ACTION_HEADSET_PLUG event, plugged in: false, : WHC.oADA@AMk
01-27 13:10:06.916  7024  7075 F libc    : Fatal signal 31 (SIGSYS), code 1 (SYS_SECCOMP) in tid 7075 (Thread-2), pid 7024 (eaming.rocdroid)
01-27 13:10:06.948   531   541 I system_server: NativeAlloc concurrent copying GC freed 203554(9319KB) AllocSpace objects, 26(2088KB) LOS objects, 49% free, 13MB/27MB, paused 68us total 126.356ms
01-27 13:10:06.958   531   542 W JavaBinder: BinderProxy is being destroyed but the application did not call unlinkToDeath to unlink all of its death recipients beforehand.  Releasing leaked death recipient: com.android.server.AlarmManagerService$2
01-27 13:10:06.958   531   542 I BpBinder: onLastStrongRef automatically unlinking death recipients: <uncached descriptor>
01-27 13:10:06.966   531   542 W JavaBinder: BinderProxy is being destroyed but the application did not call unlinkToDeath to unlink all of its death recipients beforehand.  Releasing leaked death recipient: com.android.server.AlarmManagerService$2
01-27 13:10:06.966   531   542 I BpBinder: onLastStrongRef automatically unlinking death recipients: <uncached descriptor>
01-27 13:10:07.014  7080  7080 I crash_dump32: obtaining output fd from tombstoned, type: kDebuggerdTombstone
01-27 13:10:07.016   295   295 I tombstoned: received crash request for pid 7075
01-27 13:10:07.017  7080  7080 I crash_dump32: performing dump of process 7024 (target tid = 7075)
01-27 13:10:07.022  7080  7080 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-27 13:10:07.022  7080  7080 F DEBUG   : Build fingerprint: 'google/sdk_gphone_x86_arm/generic_x86_arm:11/RSR1.201013.001/6903271:userdebug/dev-keys'
01-27 13:10:07.023  7080  7080 F DEBUG   : Revision: '0'
01-27 13:10:07.023  7080  7080 F DEBUG   : ABI: 'x86'
01-27 13:10:07.024  7080  7080 F DEBUG   : Timestamp: 2023-01-27 13:10:07+0400
01-27 13:10:07.024  7080  7080 F DEBUG   : pid: 7024, tid: 7075, name: Thread-2  >>> org.rocstreaming.rocdroid <<<
01-27 13:10:07.024  7080  7080 F DEBUG   : uid: 10153
01-27 13:10:07.024  7080  7080 F DEBUG   : signal 31 (SIGSYS), code 1 (SYS_SECCOMP), fault addr --------
01-27 13:10:07.024  7080  7080 F DEBUG   : Cause: seccomp prevented call to disallowed x86 system call 345
01-27 13:10:07.024  7080  7080 F DEBUG   :     eax 00000159  ebx 00000055  ecx 00000000  edx 00000000
01-27 13:10:07.025  7080  7080 F DEBUG   :     edi 00000000  esi 00000000
01-27 13:10:07.025  7080  7080 F DEBUG   :     ebp 910a532e  esp ba84d518  eip eb6e4b99
01-27 13:10:07.068  7080  7080 F DEBUG   : backtrace:
01-27 13:10:07.068  7080  7080 F DEBUG   :       #00 pc 00000b99  [vdso] (__kernel_vsyscall+9)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #01 pc 0005ad68  /apex/com.android.runtime/lib/bionic/libc.so (syscall+40) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #02 pc 000453de  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #03 pc 00042bfa  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #04 pc 000e86f0  /apex/com.android.runtime/lib/bionic/libc.so (pthread_once+96) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #05 pc 00040bb3  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #06 pc 0004175f  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #07 pc 000415d1  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #08 pc 00037b51  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.068  7080  7080 F DEBUG   :       #09 pc 00012e1f  /data/app/~~yD7DUEvEj10Nc2kfVQgpgw==/org.rocstreaming.rocdroid-BLYF5bxDTN3tlclXto0b3g==/base.apk!libroc.so (offset 0x13000)
01-27 13:10:07.171     0     0 D logd    : logdr: UID=10153 GID=10153 PID=7080 n tail=50 logMask=8 pid=7024 start=0ns timeout=0ns
01-27 13:10:07.173     0     0 D logd    : logdr: UID=10153 GID=10153 PID=7080 n tail=50 logMask=1 pid=7024 start=0ns timeout=0ns
01-27 13:10:07.295     0     0 D logd    : logdr: UID=10153 GID=10153 PID=7080 n tail=0 logMask=8 pid=7024 start=0ns timeout=0ns
01-27 13:10:07.297     0     0 D logd    : logdr: UID=10153 GID=10153 PID=7080 n tail=0 logMask=1 pid=7024 start=0ns timeout=0ns
01-27 13:10:07.310   295   295 E tombstoned: Tombstone written to: /data/tombstones/tombstone_04
01-27 13:10:07.311   531  7087 W ActivityTaskManager:   Force finishing activity org.rocstreaming.rocdroid/.MainActivity
01-27 13:10:07.313   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3eea30000 0x3ef330000]
01-27 13:10:07.314   531  7088 I DropBoxManagerService: add tag=data_app_native_crash isTagEnabled=true flags=0x2
01-27 13:10:07.317   531   586 I BootReceiver: Copying /data/tombstones/tombstone_04 to DropBox (SYSTEM_TOMBSTONE)
01-27 13:10:07.318   531   586 I DropBoxManagerService: add tag=SYSTEM_TOMBSTONE isTagEnabled=true flags=0x2
01-27 13:10:07.323     0     0 I init    : Untracked pid 7080 exited with status 0
01-27 13:10:07.328   531   578 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.stats.service.DropBoxEntryAddedReceiver
01-27 13:10:07.328   531   578 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.330     0     0 I init    : Untracked pid 7082 exited with status 0
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_10 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_9 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_7 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_4 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_11 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_5 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_2 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_6 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_3 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.328   531   843 W InputReader: Device virtio_input_multi_touch_8 is associated with display ADISPLAY_ID_NONE.
01-27 13:10:07.349   531   578 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.stats.service.DropBoxEntryAddedReceiver
01-27 13:10:07.349   531   578 W BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.DROPBOX_ENTRY_ADDED flg=0x10 (has extras) } to com.google.android.gms/.chimera.GmsIntentOperationService$PersistentTrustedReceiver
01-27 13:10:07.367   531   583 E libprocessgroup: AddTidToCgroup failed to write '7089'; fd=111: Invalid argument
01-27 13:10:07.367   531   583 E libprocessgroup: Failed to add task into cgroup
01-27 13:10:07.367   531   583 W libprocessgroup: ExecuteForTask failed for aggregate profile: Invalid argument
01-27 13:10:07.377   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3ec000000 0x3ece10000]
01-27 13:10:07.397   321  7001 D goldfish-address-space: claimShared: Ask to claim region [0x3f4000000 0x3f4e10000]
01-27 13:10:07.401   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3f4e10000 0x3f5c20000]
01-27 13:10:07.401   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3f5c20000 0x3f6a30000]
01-27 13:10:07.406   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3f8000000 0x3f8e10000]
01-27 13:10:07.406   321   369 D goldfish-address-space: claimShared: Ask to claim region [0x3f8e10000 0x3f9c20000]
01-27 13:10:07.416   531  2535 I AudioPolicyProxy: audio policy android.media.audiopolicy.IAudioPolicyCallback$Stub$Proxy@ecb69b1 died
01-27 13:10:07.417   395  5934 D APM_AudioPolicyMix: unregisterMix(): removing mix for dev=0x8000 addr=-1416752953:ap:4mixp:0
01-27 13:10:07.418   531   843 I WindowManager: WIN DEATH: Window{ce2d690 u0 org.rocstreaming.rocdroid/org.rocstreaming.rocdroid.MainActivity}
01-27 13:10:07.418   531   843 W InputDispatcher: Attempted to unregister already unregistered input channel 'ce2d690 org.rocstreaming.rocdroid/org.rocstreaming.rocdroid.MainActivity (server)'
01-27 13:10:07.419   531  2319 I ActivityManager: Process org.rocstreaming.rocdroid (pid 7024) has died: fg +50 FGS 
01-27 13:10:07.406     0     0 I binder  : undelivered transaction 506204, process died.
01-27 13:10:07.411     0     0 I binder  : undelivered transaction 506436, process died.
01-27 13:10:07.430   531  2090 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:07.431   302   302 I Zygote  : Process 7024 exited due to signal 31 (Bad system call)
01-27 13:10:07.431   307   501 I r_submix: in_standby()
01-27 13:10:07.433   395  5934 W APM::AudioInputDescriptor: close client with port ID 65 still active on input 64
01-27 13:10:07.438   531  3567 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:07.443   531   572 W ActivityManager: setHasOverlayUi called on unknown pid: 7024
01-27 13:10:07.461   531   580 I libprocessgroup: Successfully killed process cgroup uid 10153 pid 7024 in 41ms
01-27 13:10:07.475  2331  2594 W ThreadPoolDumper: Queue length for executor EventBus is now 11. Perhaps some tasks are too long, or the pool is too small.
01-27 13:10:07.481  2331  2435 W LocationOracle: No location history returned by ContextManager
01-27 13:10:07.510  2331  2331 I BgTaskExecutorImpl: Starting EXCLUSIVE background task TNG_MINUS_ONE_SYNC.
01-27 13:10:07.514  2331  2448 E MDD     : DownloadProgressMonitor: Can't find file group for uri: android://com.google.android.googlequicksearchbox/files/sharedminusonemodule/shared/SharedMinusOneData.pb.tmp
01-27 13:10:07.522  2331  2594 I TngMinusOneSync: Syncing TNG:-1
01-27 13:10:07.544  1225  2541 W GCoreFlp: No location to return for getLastLocation()
01-27 13:10:07.635   395  5934 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:07.635   395  5934 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:07.635   531  2099 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:07.635   531  2099 I chatty  : uid=1000(system) Binder:531_15 identical 1 line
01-27 13:10:07.637   531  2099 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:07.842   307   501 D r_submix: out_set_parameters(): shutting down MonoPipe sink
01-27 13:10:07.842   307   501 D r_submix: adev_close_output_stream() addr = -1416752953:ap:4mixp:0
01-27 13:10:07.843   531  2099 I system_server: oneway function results will be dropped but finished with status OK and parcel size 4
01-27 13:10:07.844   395  5934 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:07.844   395  5934 W APM::AudioPolicyEngine: getDevicesForStrategy() unknown strategy: -1
01-27 13:10:07.850   395   395 W APM_AudioPolicyManager: stopInput no input for client 65
01-27 13:10:07.850   307   501 D r_submix: adev_close_input_stream()
01-27 13:10:07.850   307   501 D r_submix: submix_audio_device_release_pipe_l(idx=9) addr=-1416752953:ap:4mixp:0
01-27 13:10:07.850   307   501 D r_submix: submix_audio_device_destroy_pipe_l(): pipe destroyed
01-27 13:10:07.852   395   395 W APM_AudioPolicyManager: releaseInput no input for client 65
01-27 13:10:07.855   531   531 I Telecom : WiredHeadsetManager: ACTION_HEADSET_PLUG event, plugged in: false, : WHC.oADR@AMo
01-27 13:10:08.390   531  2535 D WifiNl80211Manager: Scan result ready event
01-27 13:10:08.390   531  2535 D WifiNative: Scan result ready event

Linter warnings about kotlin version

./gradlew build

> Task :app:lint
Execution optimizations have been disabled for task ':app:lint' to ensure correctness due to the following reasons:
  - In plugin 'com.android.internal.version-check' type 'com.android.build.gradle.tasks.LintGlobalTask' property 'allInputs' cannot be resolved:  Cannot convert the provided notation to a File or URI: kotlin-android-extensions-runtime-1.3.71.jar (org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.71). The following types/formats are supported:  - A String or CharSequence path, for example 'src/main/java' or '/usr/include'. - A String or CharSequence URI, for example 'file:/usr/include'. - A File instance. - A Path instance. - A Directory instance. - A RegularFile instance. - A URI or URL instance. - A TextResource instance. Reason: An input file collection couldn't be resolved, making it impossible to determine task inputs. Please refer to https://docs.gradle.org/7.6/userguide/validation_problems.html#unresolvable_input for more details about this problem.
Ran lint on variant debug: 5 issues found
Ran lint on variant release: 5 issues found
Wrote HTML report to file:///home/victor/dev/roc-streaming/roc-droid/app/build/reports/lint-results.html
Wrote XML report to file:///home/victor/dev/roc-streaming/roc-droid/app/build/reports/lint-results.xml

Please take care for versioning

Thanks for making the APK available for everyone here! Checking it I noticed its versioning doesn't match the tag name. Could you please keep an eye on this?

  • make versionName reflect the (human readable) version, i.e. what you expect people report along with issues
  • make sure to always increase versionCode with each new release, as that's what Android uses to keep versions apart (it only considers higher versionCodes to represent updates)

Thanks!

Fix potential race in start/stop

There is a potential race in startStopReceiver and startStopSender.

    fun startStopReceiver(@Suppress("UNUSED_PARAMETER") view: View) {
        if (senderReceiverService.isReceiverAlive()) {
            senderReceiverService.stopReceiver()
        } else {
            senderReceiverService.startReceiver()
        }
    }

Assume that the user presses STOP, startStopReceiver() is invoked, and it calls stopReceiver(). Then receiver thread receives interrupt exception and invokes senderChanged(false). UI thread handles it and renames button from STOP to START. Then user presses START button and startStopReceiver() is invoked again.

The code above expects that in this situation isReceiverAlive() will return false, so that we will call startReceiver().

However, it's possible that the receiver thread already called senderChanged(), but didn't finish yet, and isReceiverAlive() will report true. In result, the user presses START, but we call stopReceiver() and don't try to start anything.

This race is present for both receiver and sender.

[sender] Sound control not working

Hello there,
The volume is always on maximum when streaming from my phone (Asus ZenFone 8 with default Android 13), and I'm not sure if the volume is supposed to by synchronized with Android or if it's a missing feature?

Nothing plays on remote audio

I have been using it as a receiver and have no problem but I have an issue while using it as a sender, I also try playing several different apps.

Device: Asus X01BD running on /e/OS 1.8.1
Remote (PC): EndeavourOS ArchLinux x86_64
Receiver command: roc-recv -vv -s rtp+rs8m://<REMOTE_IP>:10001 -r rs8m://<REMOTE_IP>:10002 -o alsa://default

I don't see any activity indicating audio is received:

image

Improve README

  • project description and features
  • screenshot
  • build instructions
  • license and authors

Android service

Register foreground service with persistent notification to allow sender and receiver to run even if the app is closed. We would also need a button in the notification that stops and terminates the service.

See also #1, the implementation of these issues might overlap.

LDPC FEC is not supported?

I have the following pipewire config which works with another pipewire instance, but doesn't work with roc-droid (I only hear awful noises):

{
  "context.modules": [
    {
      "args": {
        "fec.code": "ldpc",
        "remote.ip": "192.168.0.110",
        "sink.name": "ROC sink droid",
        "sink.props": {
          "node.description": "ROC sink droid",
          "node.name": "roc-sink-droid"
        }
      },
      "name": "libpipewire-module-roc-sink"
    }
  ]
}

When I remove "fec.code": "ldpc", line, it starts to work.

Display presence of connected sender

We should add some indication in the UI whether a remote Roc sender is currently connected to the local Roc receiver, or not. Such an indication would be handy when a sender is connected, but there is no sound for other reasons (e.g. it plays silence or a wrong output device is selected in the app).

Currently libroc API doesn't provide a way to determine whether there are connected clients. We should add it to core and java bindings.

UI get's cut in landscape mode

Screenshot_20230126-153229573 (1)

The Sender section is cut off as seen in the screenshot above making it impossible to change the IP or to start the sender in landscape mode.

Implement source (sender)

We show allow to record audio from microphone or local apps (i.e. capture their playback) and pass it to Roc sender.

We should allow the user to select the input device and to configure the address of the remote receiver to which to connect the sender.

Very high latency when receiver s9+ snapdragon.

Hello, the android app on my S9+ has a very large amount of latency, measured when using jack_delay.

Line in - headphone direct loop using standard aux cable
Line in loop = 17-18ms

ROC direct localhost loop measured acceptable, when setting sess_delay to 30ms (any lower and it stopped working consitently)
ROC - Localhost loop = 45-50ms

ROC using USB tether while connecting headphone directly to line IN, ping between devices measured about 4-5ms was ludicrously high for the setup
ROC - USB tether = 350-365ms average, but consistent.

as a comparison to similar real time audio setup, I tested sonobus
I didn't test a localhost loop, but the monitor alone was around 42ms.

sonobus when connected via usb network, same loop with headphones and same cord
sonobus - USB tether = 80-75ms with spikes to 90ms.

I unfortunately do not have any other devices to test with

Adaptive layout

Adapt app layout to the screen size to support less typical cases:

  • mobile phone, rotated
  • tablet, rotated and not rotated
  • TV (#23)

What we need to adjust:

  • font size - increase or decrease if necessary
  • tab size - fill 100% of screen width
  • maybe somehow improve widgets layout

Change Network and Hardware Latency

Hi,
This is a feature request:
Is it possible to add 2 options for Latency:
One for the actual device DSP Buffer Size and one for the Network Buffer Size?

Im getting around 200-300 ms of latency, and I want to be able to reduce that to like 40 (I have tested it out on my Laptop, our network Infrastructure can handle such small latency).

Hope this feature get's added soon!

Stopped working after a few stop/start presses

I pressed Stop and Start several times and the sound disappeared. The sender on PC is still running. After restarting the app and pressing Start again, it started working again.

Probably it can be fixed by creating a dedicated thread that manages sender and receiver threads, and sending tasks to it when we want to start or stop them.

Keep running when the app is closed

If the user started sender or receiver and the closed the app, we can continue running and preserve notification. If the user taps notification, we should open the app. When the app is opened (manually or via notification tap), it should attach to the sender-receiver service running in the background.

Notification look-and-feel

Currently we use notification with two small text buttons to stop sender and receiver. If the user started sender, notification will have "stop sender" button. The same for receiver. If the user didn't start anything, no notification is present.

Probably the following behavior would be more convenient:

  • in the app UI, instead of two separate START/STOP buttons for sender and receiver, we can have one START/STOP button and two toggle buttons to enable/disable sender and receiver
  • in notification UI, instead of two separate STOP buttons, we can have one START/STOP button, just like in the app
  • we can make notification button bigger and use PLAY and STOP icons
  • when the user presses STOP in app or in notification, both sender and receiver are stopped
  • when the user presses START in app or in notification, we start what is enabled by toggle buttons
  • notification is always present, even if nothing is running currently

Rationale:

  • the user usually decides once what they need (sender or receiver or both) and then most times needs to start and stop them according to that decision; so it would be reasonable to have a quick button for that;

  • one big button to start or stop everything is easier to use;

  • if the user stopped everything via notification, chances are that they will want to start them back after a while, so it's better to keep notification.

Weird behavior with headphones

When I insert headphones into the jack port, the sound is duplicated both to internal speakers and to the headphones.

Duplicate "Copied to clipboard" toast

When I press COPY on IP address or PORT field on Android 13, I see two duplicate toasts:

  • one from the app, in the middle of the screen, with text "Copies!"
  • another from the system, at the bottom of the screen, with text "Copied to clipboard."

release apk has changed signatures?

adb: failed to install roc-droid-0.0.5.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package org.rocstreaming.rocdroid signatures do not match previously installed version; ignoring!]

Is this expected?

Rework notification UI

  • Add app icon
  • Remove unnecessary text (currently there are three lines of text)
  • Use bigger PLAY/PAUSE-style buttons to enable/disable sender/receiver, like in media players. Maybe using Notification.MediaStyle. See details here: #15 (comment)

There is also an issue to make notification persistent: #17

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.