bondagit / ravenna-alsa-lkm Goto Github PK
View Code? Open in Web Editor NEWRAVENNA ALSA LKM
RAVENNA ALSA LKM
/Down/ravenna-alsa-lkm-aes67-daemon/driver$ make
make -C /lib/modules/5.13.0-48-generic/build/ M=/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver modules
make[1]: Entering directory '/usr/src/linux-headers-5.13.0-48-generic'
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/c_wrapper_lib.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/audio_driver.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/manager.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/module_main.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/PTP.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/module_interface.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/module_netlink.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/module_timer.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/EtherTubeNetfilter.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/RTP_streams_manager.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/RTP_audio_stream.o
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/RTP_audio_stream.c: In function ‘PrepareBufferLives’:
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/RTP_audio_stream.c:1044:41: warning: unused variable ‘delta’ [-Wunused-variable]
1044 | int64_t delta = self->m_tRTPStream.m_ui64LastAudioSampleReceivedSAC - pManager->get_global_SAC(pManager->user);
| ^~~~~
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/RTP_stream.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/RTP_stream_info.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_EthUtils.o
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_EthUtils.c: In function ‘MTAL_DumpID’:
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_EthUtils.c:107:25: warning: unused variable ‘by’ [-Wunused-variable]
107 | uint8_t by = (ullID >> (ui32 * 8)) & 0xFF;
| ^~
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_EthUtils.c: In function ‘MTAL_DumpAppleMIDI’:
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_EthUtils.c:556:50: warning: unused variable ‘pSynch’ [-Wunused-variable]
556 | TAppleMIDI_Synch_Packet* pSynch = (TAppleMIDI_Synch_Packet*)pAppleMIDI_PacketBase;
| ^~~~~~
/home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_EthUtils.c:580:56: warning: unused variable ‘pAppleMIDI_IN_NO_OK_BY_Packet’ [-Wunused-variable]
580 | TAppleMIDI_IN_NO_OK_BY_Packet* pAppleMIDI_IN_NO_OK_BY_Packet = (TAppleMIDI_IN_NO_OK_BY_Packet*)pAppleMIDI_PacketBase;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTAL_LKernelAPI.o
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MTConvert.o
LD [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MergingRavennaALSA.o
MODPOST /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/Module.symvers
CC [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MergingRavennaALSA.mod.o
LD [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MergingRavennaALSA.ko
BTF [M] /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MergingRavennaALSA.ko
Skipping BTF generation for /home/k/Down/ravenna-alsa-lkm-aes67-daemon/driver/MergingRavennaALSA.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.13.0-48-generic'
https://forum.merging.com/viewtopic.php?f=73&t=14644&p=41459#p41459
The Butler public binary depends on libcurl3, which is no longer available for Ubuntu 20.04 and others. It should be re-compiled with libcurl4 support and re-released.
From here:
https://bitbucket.org/MergingTechnologies/ravenna-alsa-lkm/src/master/
I see there are some recent updates
Cannot compile it in kernel 6.2. Tried with gcc 12.2.1-5 and also with clang 15.0.7-4
This is the output:
DKMS make.log for ravenna-alsa-lkm-r135.140abf6 for kernel 6.2.2-1-cachyos-rt (x86_64) Wed Mar 22 03:41:54 PM +07 2023 make -C /lib/modules/6.2.2-1-cachyos-rt/build/ M=/var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build modules CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/c_wrapper_lib.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/audio_driver.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/manager.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/module_main.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/PTP.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/module_interface.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/module_netlink.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/module_timer.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/EtherTubeNetfilter.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/RTP_streams_manager.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/RTP_audio_stream.o /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/RTP_audio_stream.c:1044:13: warning: unused variable 'delta' [-Wunused-variable] int64_t delta = self->m_tRTPStream.m_ui64LastAudioSampleReceivedSAC - pManager->get_global_SAC(pManager->user); ^ CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/RTP_stream.o 1 warning generated. CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/RTP_stream_info.o CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTAL_EthUtils.o /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/audio_driver.c:1340:8: warning: variable 'ptp_frame_size' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if(chip->ravenna_peer) ^~~~~~~~~~~~~~~~~~ /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/audio_driver.c:1344:22: note: uninitialized use occurs here if(periodSize != ptp_frame_size) ^~~~~~~~~~~~~~ /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/audio_driver.c:1340:5: note: remove the 'if' if its condition is always true if(chip->ravenna_peer) ^~~~~~~~~~~~~~~~~~~~~~ /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/audio_driver.c:1304:28: note: initialize the variable 'ptp_frame_size' to silence this warning uint32_t ptp_frame_size; ^ = 0 /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTAL_EthUtils.c:107:11: warning: unused variable 'by' [-Wunused-variable] uint8_t by = (ullID >> (ui32 * 8)) & 0xFF; ^ /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTAL_EthUtils.c:556:29: warning: unused variable 'pSynch' [-Wunused-variable] TAppleMIDI_Synch_Packet* pSynch = (TAppleMIDI_Synch_Packet*)pAppleMIDI_PacketBase; ^ /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTAL_EthUtils.c:580:35: warning: unused variable 'pAppleMIDI_IN_NO_OK_BY_Packet' [-Wunused-variable] TAppleMIDI_IN_NO_OK_BY_Packet* pAppleMIDI_IN_NO_OK_BY_Packet = (TAppleMIDI_IN_NO_OK_BY_Packet*)pAppleMIDI_PacketBase; ^ CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTAL_LKernelAPI.o 3 warnings generated. CC [M] /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTConvert.o 1 warning generated. /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTConvert.c:176:19: error: a function declaration without a prototype is deprecated in all versions of C [-Werror,-Wstrict-prototypes] void MTConvertInit() //Init_Converter() ^ void 1 error generated. make[2]: *** [scripts/Makefile.build:252: /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build/MTConvert.o] Error 1 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [Makefile:2019: /var/lib/dkms/ravenna-alsa-lkm/r135.140abf6/build] Error 2 make: *** [Makefile:15: modules] Error 2
[audiolinux@archlinux driver]$ make
make -C /lib/modules/5.12.1-arch1-1/build/ M=/media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver modules
make[1]: Entering directory '/usr/lib/modules/5.12.1-arch1-1/build'
CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/c_wrapper_lib.o
CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/audio_driver.o
CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/manager.o
CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/module_main.o
CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/PTP.o
CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/module_interface.o
/media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/module_interface.c:63:25: error: expected declaration specifiers or ‘...’ before string constant
63 | MODULE_SUPPORTED_DEVICE("{{ALSA,Merging RAVENNA}}");
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [scripts/Makefile.build:271: /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver/module_interface.o] Error 1
make[1]: *** [Makefile:1851: /media/linux/Downloads/Temp/ravenna-alsa-lkm-1.1/driver] Error 2
make[1]: Leaving directory '/usr/lib/modules/5.12.1-arch1-1/build'
make: *** [Makefile:14: modules] Error 2
The following sample rates are currently not working: 192, 384khz
Any attempt to use these results in a kernel hang.
Also, the attempt to use speaker-test application with 96Khz results in kernel hang.
Greetings - in attempting to build the driver on Ubuntu 23.10 I get this error:
| ^~~~
CC [M] /home/steveb/ravenna-alsa-lkm/driver/module_interface.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/module_netlink.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/module_timer.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/EtherTubeNetfilter.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/RTP_streams_manager.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/RTP_audio_stream.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/RTP_stream.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/RTP_stream_info.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/MTAL_EthUtils.o
CC [M] /home/steveb/ravenna-alsa-lkm/driver/MTAL_LKernelAPI.o
/home/steveb/ravenna-alsa-lkm/driver/MTAL_LKernelAPI.c:94:10: fatal error: stdarg.h: No such file or directory
94 | #include <stdarg.h>
| ^~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.build:251: /home/steveb/ravenna-alsa-lkm/driver/MTAL_LKernelAPI.o] Error 1
make[2]: *** [/usr/src/linux-headers-6.5.0-14-generic/Makefile:2037: /home/steveb/ravenna-alsa-lkm/driver] Error 2
make[1]: *** [Makefile:234: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.5.0-14-generic'
make: *** [Makefile:14: modules] Error 2
steveb@TSM-i7-UB:~/ravenna-alsa-lkm/driver$
make -C /media/gpkernel/rpi/kernel/rpi3/kernel-GentooPlayer-ST/lib/modules/6.1.28-GentooPlayer-ST+/build/ M=/media/gpkernel/rpi/ravenna-alsa-lkm/driver modules CC [M] /media/gpkernel/rpi/ravenna-alsa-lkm/driver/c_wrapper_lib.o /media/gpkernel/rpi/ravenna-alsa-lkm/driver/c_wrapper_lib.c: In function ‘CW_netfilter_register_hook’: /media/gpkernel/rpi/ravenna-alsa-lkm/driver/c_wrapper_lib.c:64:11: error: implicit declaration of function ‘nf_register_net_hook’ [-Werror=implicit-function-declaration] 64 | ret = nf_register_net_hook(&init_net, nfho); //register hook | ^~~~~~~~~~~~~~~~~~~~ /media/gpkernel/rpi/ravenna-alsa-lkm/driver/c_wrapper_lib.c: In function ‘CW_netfilter_unregister_hook’: /media/gpkernel/rpi/ravenna-alsa-lkm/driver/c_wrapper_lib.c:77:5: error: implicit declaration of function ‘nf_unregister_net_hook’; did you mean ‘unregister_netdev’? [-Werror=implicit-function-declaration] 77 | nf_unregister_net_hook(&init_net, nfho); //cleanup unregister hook | ^~~~~~~~~~~~~~~~~~~~~~ | unregister_netdev cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:250: /media/gpkernel/rpi/ravenna-alsa-lkm/driver/c_wrapper_lib.o] Error 1 make[1]: *** [Makefile:2012: /media/gpkernel/rpi/ravenna-alsa-lkm/driver] Error 2 make: *** [Makefile:15: modules] Error 2
According to the PTP_WATCHDOG_ELAPSE comment we assume to receive at least one sync each 2s
its supposed to be 2s.
#define PTP_WATCHDOG_ELAPSE 20000000 // we assume to receive at least
#define NS_2_REF_UNIT 100000 // ns is the linux time unit
void get_clock_time(uint64_t* clock_time)
{
ktime_t kt_now;
kt_now = ktime_get();
*clock_time = (uint64_t)ktime_to_ns(kt_now);
}
...
uint64_t ui64CurrentRTXClockTime;
get_clock_time(&ui64CurrentRTXClockTime);
ui64CurrentRTXClockTime /= NS_2_REF_UNIT; // [100us]
...
uint64_t ui64WatchDogElapse = ui64CurrentRTXClockTime - self->m_ui64LastWatchDogTime;
if(ui64WatchDogElapse >= PTP_WATCHDOG_ELAPSE)
As I read that and have tested it for is that PTP_WATCHDOG_ELAPSE is in 100us as unit. That means that PTP_WATCHDOG_ELAPSE is 20000000 * 100us = 2000s.
I'd suggest cutting it by 1000, because then the rest of the code behaves as expected when a ptp clock is lost.
I have seen the hint with Kernel >5.2 compilation failure but what should i do if i use this kernel? Cant the __put_user_x
calls just be replaced with __put_user
/ put_user
or something like that? Is there a workaround? Even the original repository wont compile and gives me a implicit declaration of function ‘__put_user_x’; did you mean ‘put_user’?
compiler error but its nothing stated that it wont work with newer Kernel versions.
Cannot compile driver on kernel 5.11:
[audiolinux@archlinux driver]$ make make -C /lib/modules/5.11.11-arch1-1/build/ M=/media/linux/Downloads/Temp/ravenna-alsa-lkm/driver modules make[1]: Entering directory '/usr/lib/modules/5.11.11-arch1-1/build' CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm/driver/c_wrapper_lib.o CC [M] /media/linux/Downloads/Temp/ravenna-alsa-lkm/driver/audio_driver.o /media/linux/Downloads/Temp/ravenna-alsa-lkm/driver/audio_driver.c: In function ‘mr_alsa_audio_pcm_capture_copy_internal’: /media/linux/Downloads/Temp/ravenna-alsa-lkm/driver/audio_driver.c:1210:9: error: implicit declaration of function ‘__put_user_x’; did you mean ‘__put_user_8’? [-Werror=implicit-function-declaration] 1210 | __put_user_x(1, val, (unsigned long __user *)src, ret_pu); | ^~~~~~~~~~~~ | __put_user_8 cc1: some warnings being treated as errors make[2]: *** [scripts/Makefile.build:279: /media/linux/Downloads/Temp/ravenna-alsa-lkm/driver/audio_driver.o] Error 1 make[1]: *** [Makefile:1809: /media/linux/Downloads/Temp/ravenna-alsa-lkm/driver] Error 2 make[1]: Leaving directory '/usr/lib/modules/5.11.11-arch1-1/build' make: *** [Makefile:14: modules] Error 2
I have compiled the Merging driver, and added it to the appropriate modules directory, but when trying to insert it, I get the following errors in dmesg.
I'm using Alpine Linux, kernel 5.10.27-lts.
It seems likely that the issue is a lack of some kind of kernel ALSA support. But I can't find any useful info towards fixing this; as far as I can tell Alpine should work just fine with sound.
[ 347.614066] MergingRavennaALSA: Unknown symbol snd_ctl_add (err -2)
[ 347.614076] MergingRavennaALSA: Unknown symbol snd_pcm_lib_free_vmalloc_buffer (err -2)
[ 347.614084] MergingRavennaALSA: Unknown symbol snd_pcm_new (err -2)
[ 347.614091] MergingRavennaALSA: Unknown symbol snd_pcm_add_chmap_ctls (err -2)
[ 347.614097] MergingRavennaALSA: Unknown symbol snd_card_register (err -2)
[ 347.614102] MergingRavennaALSA: Unknown symbol snd_card_free (err -2)
[ 347.614184] MergingRavennaALSA: Unknown symbol snd_interval_refine (err -2)
[ 347.614218] MergingRavennaALSA: Unknown symbol snd_pcm_format_physical_width (err -2)
[ 347.614241] MergingRavennaALSA: Unknown symbol snd_ctl_new1 (err -2)
[ 347.614255] MergingRavennaALSA: Unknown symbol _snd_pcm_lib_alloc_vmalloc_buffer (err -2)
[ 347.614266] MergingRavennaALSA: Unknown symbol snd_pcm_hw_rule_add (err -2)
[ 347.614274] MergingRavennaALSA: Unknown symbol snd_card_new (err -2)
[ 347.614284] MergingRavennaALSA: Unknown symbol snd_interval_list (err -2)
[ 347.614292] MergingRavennaALSA: Unknown symbol snd_pcm_lib_ioctl (err -2)
[ 347.614303] MergingRavennaALSA: Unknown symbol snd_pcm_lib_get_vmalloc_page (err -2)
[ 347.614311] MergingRavennaALSA: Unknown symbol snd_ctl_notify (err -2)
[ 347.614319] MergingRavennaALSA: Unknown symbol snd_pcm_set_ops (err -2)
[ 347.614326] MergingRavennaALSA: Unknown symbol snd_pcm_hw_constraint_list (err -2)
[ 347.614404] MergingRavennaALSA: Unknown symbol snd_pcm_period_elapsed (err -2)
[ 347.614476] MergingRavennaALSA: Unknown symbol snd_pcm_hw_constraint_step (err -2)
[ 347.614491] MergingRavennaALSA: Unknown symbol snd_pcm_format_width (err -2)
[ 660.693682] MergingRavennaALSA: Unknown symbol snd_ctl_add (err -2)
[ 660.693690] MergingRavennaALSA: Unknown symbol snd_pcm_lib_free_vmalloc_buffer (err -2)
[ 660.693696] MergingRavennaALSA: Unknown symbol snd_pcm_new (err -2)
[ 660.693702] MergingRavennaALSA: Unknown symbol snd_pcm_add_chmap_ctls (err -2)
[ 660.693706] MergingRavennaALSA: Unknown symbol snd_card_register (err -2)
[ 660.693711] MergingRavennaALSA: Unknown symbol snd_card_free (err -2)
[ 660.693721] MergingRavennaALSA: Unknown symbol snd_interval_refine (err -2)
[ 660.693727] MergingRavennaALSA: Unknown symbol snd_pcm_format_physical_width (err -2)
[ 660.693744] MergingRavennaALSA: Unknown symbol snd_ctl_new1 (err -2)
[ 660.693757] MergingRavennaALSA: Unknown symbol _snd_pcm_lib_alloc_vmalloc_buffer (err -2)
[ 660.693764] MergingRavennaALSA: Unknown symbol snd_pcm_hw_rule_add (err -2)
[ 660.693770] MergingRavennaALSA: Unknown symbol snd_card_new (err -2)
[ 660.693779] MergingRavennaALSA: Unknown symbol snd_interval_list (err -2)
[ 660.693785] MergingRavennaALSA: Unknown symbol snd_pcm_lib_ioctl (err -2)
[ 660.693793] MergingRavennaALSA: Unknown symbol snd_pcm_lib_get_vmalloc_page (err -2)
[ 660.693799] MergingRavennaALSA: Unknown symbol snd_ctl_notify (err -2)
[ 660.693878] MergingRavennaALSA: Unknown symbol snd_pcm_set_ops (err -2)
[ 660.693958] MergingRavennaALSA: Unknown symbol snd_pcm_hw_constraint_list (err -2)
[ 660.693989] MergingRavennaALSA: Unknown symbol snd_pcm_period_elapsed (err -2)
[ 660.693995] MergingRavennaALSA: Unknown symbol snd_pcm_hw_constraint_step (err -2)
[ 660.694005] MergingRavennaALSA: Unknown symbol snd_pcm_format_width (err -2)
This is the output of apk list --installed | grep alsa
:
alsa-utils-openrc-1.2.4-r0 x86_64 {alsa-utils} (GPL-2.0-or-later) [installed]
alsa-lib-dev-1.2.4-r2 x86_64 {alsa-lib} (LGPL-2.1-or-later) [installed]
alsa-lib-1.2.4-r2 x86_64 {alsa-lib} (LGPL-2.1-or-later) [installed]
alsa-utils-1.2.4-r0 x86_64 {alsa-utils} (GPL-2.0-or-later) [installed]
alsa-tools-1.2.2-r0 x86_64 {alsa-tools} (GPL-2.0-or-later) [installed]
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.