From 1d75db5bdefa782fc2e62cdd387ebd1de9c8cc59 Mon Sep 17 00:00:00 2001 From: Andrew Gundersen Date: Mon, 26 Jul 2021 14:08:25 -0500 Subject: [PATCH] initial commit --- .DS_Store | Bin 0 -> 6148 bytes binding.gyp | 16 + binding.js | 28 + build/Makefile | 342 ++++++++++ build/Release/.deps/Release/nodeaudio.node.d | 1 + .../nodeaudio/src/audio_handler.o.d | 8 + .../obj.target/nodeaudio/src/frame_buffer.o.d | 5 + .../obj.target/nodeaudio/src/nodeaudio.o.d | 13 + build/Release/nodeaudio.node | Bin 0 -> 38608 bytes .../obj.target/nodeaudio/src/audio_handler.o | Bin 0 -> 14000 bytes .../obj.target/nodeaudio/src/frame_buffer.o | Bin 0 -> 6048 bytes .../obj.target/nodeaudio/src/nodeaudio.o | Bin 0 -> 10076 bytes build/binding.Makefile | 6 + build/config.gypi | 200 ++++++ build/gyp-mac-tool | 615 ++++++++++++++++++ build/nodeaudio.target.mk | 195 ++++++ node_modules/bindings/README.md | 97 +++ node_modules/bindings/bindings.js | 166 +++++ node_modules/bindings/package.json | 29 + package-lock.json | 13 + package.json | 14 + src/.DS_Store | Bin 0 -> 6148 bytes src/a.out | Bin 0 -> 49736 bytes src/audio_handler.c | 259 ++++++++ src/audio_handler.h | 16 + src/audio_handler.o | Bin 0 -> 2936 bytes src/frame_buffer.c | 120 ++++ src/frame_buffer.h | 24 + src/frame_buffer.o | Bin 0 -> 2716 bytes src/makefile | 26 + src/nodeaudio | Bin 0 -> 51304 bytes src/nodeaudio.c | 90 +++ src/test.c | 44 ++ 33 files changed, 2327 insertions(+) create mode 100644 .DS_Store create mode 100644 binding.gyp create mode 100644 binding.js create mode 100644 build/Makefile create mode 100644 build/Release/.deps/Release/nodeaudio.node.d create mode 100644 build/Release/.deps/Release/obj.target/nodeaudio/src/audio_handler.o.d create mode 100644 build/Release/.deps/Release/obj.target/nodeaudio/src/frame_buffer.o.d create mode 100644 build/Release/.deps/Release/obj.target/nodeaudio/src/nodeaudio.o.d create mode 100755 build/Release/nodeaudio.node create mode 100644 build/Release/obj.target/nodeaudio/src/audio_handler.o create mode 100644 build/Release/obj.target/nodeaudio/src/frame_buffer.o create mode 100644 build/Release/obj.target/nodeaudio/src/nodeaudio.o create mode 100644 build/binding.Makefile create mode 100644 build/config.gypi create mode 100755 build/gyp-mac-tool create mode 100644 build/nodeaudio.target.mk create mode 100644 node_modules/bindings/README.md create mode 100644 node_modules/bindings/bindings.js create mode 100644 node_modules/bindings/package.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/.DS_Store create mode 100755 src/a.out create mode 100644 src/audio_handler.c create mode 100644 src/audio_handler.h create mode 100644 src/audio_handler.o create mode 100644 src/frame_buffer.c create mode 100644 src/frame_buffer.h create mode 100644 src/frame_buffer.o create mode 100644 src/makefile create mode 100755 src/nodeaudio create mode 100644 src/nodeaudio.c create mode 100644 src/test.c diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c72e823b82b4a0a9bc90f064273635bf1f8632da GIT binary patch literal 6148 zcmeHKF;2rk5S%pu1(G6kG)Vpck@$g$LP5;~fW%P*m^c!0LFb-7@CDvS1+#lcgl*Cy zK)cfJ+?{vs&U2A33qU4SehQ2L^y!MpKEpSr&(%AY#F0Is*c`W5VTm#Qsgvykzfl1_ zy8&j=}|-_7hr4mzwmJT^IaZE<$VsklmkyqPJ_t;`|! zQ*uWOT;ai5655szI-q?z7_0;!_Bd?Dw$>8LNh4+v z>wtVhlRzZ~s>BjQ0-fV&%*!Iy0RtTpiw}t_ORP}DR_FYwr9-lS9$f)fpsB!4=#KRM zKi^*eH%Z=e1zdrDrGWINm(vMfDc-G}m(#m8rC-z4G_MZ0p|D|BF?01QKBAj(Jk { + await setTimeout(() => { + callback(); + }, seconds); +} + +const recordThenPlay = async (recSeconds) => { + + console.log("Initializing nodeAudio"); + nodeAudio.initialize(); + + nodeAudio.fill_input_buffer(); + + console.log(`Recording for ${recSeconds} seconds`); + const audio = await wait(nodeAudio.return_input_buffer, recSeconds); + + console.log("Playing audio"); + nodeAudio.feed_output_buffer(audio); + + console.log("Shutting down audio"); + nodeAudio.terminate(); + +} + +recordThenPlay(5); \ No newline at end of file diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 0000000..11b7aff --- /dev/null +++ b/build/Makefile @@ -0,0 +1,342 @@ +# We borrow heavily from the kernel build setup, though we are simpler since +# we don't have Kconfig tweaking settings on us. + +# The implicit make rules have it looking for RCS files, among other things. +# We instead explicitly write all the rules we care about. +# It's even quicker (saves ~200ms) to pass -r on the command line. +MAKEFLAGS=-r + +# The source directory tree. +srcdir := .. +abs_srcdir := $(abspath $(srcdir)) + +# The name of the builddir. +builddir_name ?= . + +# The V=1 flag on command line makes us verbosely print command lines. +ifdef V + quiet= +else + quiet=quiet_ +endif + +# Specify BUILDTYPE=Release on the command line for a release build. +BUILDTYPE ?= Release + +# Directory all our build output goes into. +# Note that this must be two directories beneath src/ for unit tests to pass, +# as they reach into the src/ directory for data with relative paths. +builddir ?= $(builddir_name)/$(BUILDTYPE) +abs_builddir := $(abspath $(builddir)) +depsdir := $(builddir)/.deps + +# Object output directory. +obj := $(builddir)/obj +abs_obj := $(abspath $(obj)) + +# We build up a list of every single one of the targets so we can slurp in the +# generated dependency rule Makefiles in one pass. +all_deps := + + + +CC.target ?= $(CC) +CFLAGS.target ?= $(CPPFLAGS) $(CFLAGS) +CXX.target ?= $(CXX) +CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS) +LINK.target ?= $(LINK) +LDFLAGS.target ?= $(LDFLAGS) +AR.target ?= $(AR) + +# C++ apps need to be linked with g++. +LINK ?= $(CXX.target) + +# TODO(evan): move all cross-compilation logic to gyp-time so we don't need +# to replicate this environment fallback in make as well. +CC.host ?= gcc +CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host) +CXX.host ?= g++ +CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host) +LINK.host ?= $(CXX.host) +LDFLAGS.host ?= +AR.host ?= ar + +# Define a dir function that can handle spaces. +# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions +# "leading spaces cannot appear in the text of the first argument as written. +# These characters can be put into the argument value by variable substitution." +empty := +space := $(empty) $(empty) + +# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces +replace_spaces = $(subst $(space),?,$1) +unreplace_spaces = $(subst ?,$(space),$1) +dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1))) + +# Flags to make gcc output dependency info. Note that you need to be +# careful here to use the flags that ccache and distcc can understand. +# We write to a dep file on the side first and then rename at the end +# so we can't end up with a broken dep file. +depfile = $(depsdir)/$(call replace_spaces,$@).d +DEPFLAGS = -MMD -MF $(depfile).raw + +# We have to fixup the deps output in a few ways. +# (1) the file output should mention the proper .o file. +# ccache or distcc lose the path to the target, so we convert a rule of +# the form: +# foobar.o: DEP1 DEP2 +# into +# path/to/foobar.o: DEP1 DEP2 +# (2) we want missing files not to cause us to fail to build. +# We want to rewrite +# foobar.o: DEP1 DEP2 \ +# DEP3 +# to +# DEP1: +# DEP2: +# DEP3: +# so if the files are missing, they're just considered phony rules. +# We have to do some pretty insane escaping to get those backslashes +# and dollar signs past make, the shell, and sed at the same time. +# Doesn't work with spaces, but that's fine: .d files have spaces in +# their names replaced with other characters. +define fixup_dep +# The depfile may not exist if the input file didn't have any #includes. +touch $(depfile).raw +# Fixup path as in (1). +sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c -o $@ $< + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< + +quiet_cmd_objc = CXX($(TOOLSET)) $@ +cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< + +quiet_cmd_objcxx = CXX($(TOOLSET)) $@ +cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# Commands for precompiled header files. +quiet_cmd_pch_c = CXX($(TOOLSET)) $@ +cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_cc = CXX($(TOOLSET)) $@ +cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $< +quiet_cmd_pch_m = CXX($(TOOLSET)) $@ +cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $< +quiet_cmd_pch_mm = CXX($(TOOLSET)) $@ +cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $< + +# gyp-mac-tool is written next to the root Makefile by gyp. +# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd +# already. +quiet_cmd_mac_tool = MACTOOL $(4) $< +cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@" + +quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@ +cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4) + +quiet_cmd_infoplist = INFOPLIST $@ +cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@" + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = rm -rf "$@" && cp -af "$<" "$@" + +quiet_cmd_alink = LIBTOOL-STATIC $@ +cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^) + +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS) + +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds until one fails. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + E=$$?;\ + if [ $$E -ne 0 ]; then\ + break;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 2,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.m FORCE_DO_CMD + @$(call do_cmd,objc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.mm FORCE_DO_CMD + @$(call do_cmd,objcxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,nodeaudio.target.mk)))),) + include nodeaudio.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = cd $(srcdir); /usr/local/Cellar/node@14/14.17.0/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "--toplevel-dir=." -I/Users/adgundersen/Documents/Crimata/nodeaudio/build/config.gypi -I/usr/local/Cellar/node@14/14.17.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/common.gypi "--depth=." "-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/adgundersen/Library/Caches/node-gyp/14.17.0" "-Dnode_gyp_dir=/usr/local/Cellar/node@14/14.17.0/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/Users/adgundersen/Library/Caches/node-gyp/14.17.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/adgundersen/Documents/Crimata/nodeaudio" "-Dnode_engine=v8" binding.gyp +Makefile: $(srcdir)/../../../Library/Caches/node-gyp/14.17.0/include/node/common.gypi $(srcdir)/../../../../../usr/local/Cellar/node@14/14.17.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/build/Release/.deps/Release/nodeaudio.node.d b/build/Release/.deps/Release/nodeaudio.node.d new file mode 100644 index 0000000..5b7ce61 --- /dev/null +++ b/build/Release/.deps/Release/nodeaudio.node.d @@ -0,0 +1 @@ +cmd_Release/nodeaudio.node := c++ -bundle -undefined dynamic_lookup -Wl,-no_pie -Wl,-search_paths_first -mmacosx-version-min=10.13 -arch x86_64 -L./Release -stdlib=libc++ -o Release/nodeaudio.node Release/obj.target/nodeaudio/src/nodeaudio.o Release/obj.target/nodeaudio/src/audio_handler.o Release/obj.target/nodeaudio/src/frame_buffer.o -lportaudio diff --git a/build/Release/.deps/Release/obj.target/nodeaudio/src/audio_handler.o.d b/build/Release/.deps/Release/obj.target/nodeaudio/src/audio_handler.o.d new file mode 100644 index 0000000..c00d6b1 --- /dev/null +++ b/build/Release/.deps/Release/obj.target/nodeaudio/src/audio_handler.o.d @@ -0,0 +1,8 @@ +cmd_Release/obj.target/nodeaudio/src/audio_handler.o := cc '-DNODE_GYP_MODULE_NAME=nodeaudio' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/src -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/config -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/openssl/include -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/uv/include -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/zlib -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/v8/include -I/usr/local/include -O3 -gdwarf-2 -mmacosx-version-min=10.13 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodeaudio/src/audio_handler.o.d.raw -c -o Release/obj.target/nodeaudio/src/audio_handler.o ../src/audio_handler.c +Release/obj.target/nodeaudio/src/audio_handler.o: ../src/audio_handler.c \ + /usr/local/include/portaudio.h ../src/audio_handler.h \ + ../src/frame_buffer.h +../src/audio_handler.c: +/usr/local/include/portaudio.h: +../src/audio_handler.h: +../src/frame_buffer.h: diff --git a/build/Release/.deps/Release/obj.target/nodeaudio/src/frame_buffer.o.d b/build/Release/.deps/Release/obj.target/nodeaudio/src/frame_buffer.o.d new file mode 100644 index 0000000..73580ee --- /dev/null +++ b/build/Release/.deps/Release/obj.target/nodeaudio/src/frame_buffer.o.d @@ -0,0 +1,5 @@ +cmd_Release/obj.target/nodeaudio/src/frame_buffer.o := cc '-DNODE_GYP_MODULE_NAME=nodeaudio' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/src -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/config -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/openssl/include -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/uv/include -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/zlib -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/v8/include -I/usr/local/include -O3 -gdwarf-2 -mmacosx-version-min=10.13 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodeaudio/src/frame_buffer.o.d.raw -c -o Release/obj.target/nodeaudio/src/frame_buffer.o ../src/frame_buffer.c +Release/obj.target/nodeaudio/src/frame_buffer.o: ../src/frame_buffer.c \ + ../src/frame_buffer.h +../src/frame_buffer.c: +../src/frame_buffer.h: diff --git a/build/Release/.deps/Release/obj.target/nodeaudio/src/nodeaudio.o.d b/build/Release/.deps/Release/obj.target/nodeaudio/src/nodeaudio.o.d new file mode 100644 index 0000000..5cb2f97 --- /dev/null +++ b/build/Release/.deps/Release/obj.target/nodeaudio/src/nodeaudio.o.d @@ -0,0 +1,13 @@ +cmd_Release/obj.target/nodeaudio/src/nodeaudio.o := cc '-DNODE_GYP_MODULE_NAME=nodeaudio' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/src -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/config -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/openssl/include -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/uv/include -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/zlib -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/v8/include -I/usr/local/include -O3 -gdwarf-2 -mmacosx-version-min=10.13 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/nodeaudio/src/nodeaudio.o.d.raw -c -o Release/obj.target/nodeaudio/src/nodeaudio.o ../src/nodeaudio.c +Release/obj.target/nodeaudio/src/nodeaudio.o: ../src/nodeaudio.c \ + /Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/node_api.h \ + /Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/js_native_api.h \ + /Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/js_native_api_types.h \ + /Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/node_api_types.h \ + ../src/audio_handler.h +../src/nodeaudio.c: +/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/node_api.h: +/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/js_native_api.h: +/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/js_native_api_types.h: +/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node/node_api_types.h: +../src/audio_handler.h: diff --git a/build/Release/nodeaudio.node b/build/Release/nodeaudio.node new file mode 100755 index 0000000000000000000000000000000000000000..4eca0a8db6893f4601370db85b64763d6d1dceb0 GIT binary patch literal 38608 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 literal 0 HcmV?d00001 diff --git a/build/Release/obj.target/nodeaudio/src/frame_buffer.o b/build/Release/obj.target/nodeaudio/src/frame_buffer.o new file mode 100644 index 0000000000000000000000000000000000000000..9f7d1e1dc44b107443612007ed61930162372bd6 GIT binary patch literal 6048 zcmb7I3v64}89v9?=f;lnaGSKGDlBFVP^*ib76vVZQa3KWPEttoYET<)o$Kq=!?80z zN_nh_5Y4bMnO_3W^x5$zY(kg- z5h9W$@vn#erJ4JpgmI-E& zl+|lw#~`nQUd-H_$|Q8XJG$r!oS6TkLOBO`c*fdR5+b%@8J@XMPv&4X?11v~aa7$s=|4b1K6T%jfT%I@|jLfp?(6miIz_LUm4lxNdxkYvD9fA7A_? z(Cq_%+$v4y5poD9@;%T?8`g`Rl`6j?KcHD3^z~@gr`mkg>c%Mb3ejozrW5DlIVo;}zYGd|boyk`7HvtHru zh(|xPy4;ozaAz?oZKimVz8bYYjt2i|y%v1&pjR_K(UjXfXRh2j+qh}diwDa`Typ?1>CV zZj9)|#}{WLc^K!L&qseBOa`FFtk0}BkDY0zZ=U*erb^lF4!-l93t}_3w|JoPYZmLC zk6F{39R1`Y74am)^cs@`VDO$g)ZF?+ORQ5LZNUzXN39L)JKZRq?rpDB#baA zBVK^;e0a#nCd?4rsNs%mreJ0Y`EbF>3W-i>5ju(>I+*m%mBW_&ZHxwEdiV~l` zXqRKoCvGCb6WQ=U9MRDF`2 z5~?Mk4h!R>PTYWG?-qA4C4Iu^5E*sKiRzc^Ma~Vrzentv; zky(}FQnAmPh3PuSMQ(j(MlKensN*7!g5$DAn67qQb~-k}oF_~%$E8<}DZl0^=`D|< z%jiXQ4NR$mul-ULcQ!9vC7Az;3ZTZ9%~Q)UH}lF2vEHeMz-Qacf#H2K&BcRYRbK!WuLZh}i|+&bAd0PA zYyy{uQ4FD26$KWXJc4Q*w2z~`gS+1W;?pQbQH1j6L_j?k!7#WI&ApiBW1!<{_VP5} z1(B!O%hPOtk9VGCFGr4n$kXiO$R57{bT;bXS_C#I22<*#1032wXf+MN&!ahkR`os* zdr&kv^e;e6qd3Z~Z-KZM#UvlebvYnZN8qOelrE32$;E0g8m%tXwT9H7x0Kv92!%kd zD%ToM&9_S=KT-C8$lOHhi)g^{k97P{7jGegIttn^paDx@2>yt{ZH2m!vI zjktl}|pI+4lVD?!EiKegOI*=--F_Q|Qk?=aUUIgTT=E908pdGT*l#cc2j( z-8}0k>ow|Bnw$J+HS>;G>N5p}^(6zWDkwBk8dU-3u z`vxcO+=>HP*rhnLZ%B|>(zkOQ0$MLrF_$T-e34bv! z75TmgbKoMI!IRQY>uTYbuPtb){oo+tgV}j;fT{GmJG2k>12p*|0XwyxvK7@w*s3C{ zQy*e}wTsa%Mt%p%ZsrH&G-GNfBkBXJuKIq?uTpPtd{=<`envby*ag*|&205+Y%O?y zy_2m{uVz6t#9G?fH#-4#GxMtLN>7M|Rb_oAy9&H64zb2|wtR?v4F+vglWdvV&CXZb z*%j@qHOXp2YM8C^G~Ukw>s4jj6l+qI_D*&wfCiJy+X>c&2ifHS}{q2Yo0Gu{;h+W*t zbDLsBd3<6B%2wVbI19=nD1mU8tyF&ob;0h3=^#I5tE+dg71uzOA&B|jM2M|c;cx8} z^GDgbF18VJJ0I$W#M{AsWTKO;P?fW!bCl8Ds&e;4NLe5um&-n^|As~K5YqZ4Q22x2 zdaICiL92m!LH~PLO0?tESp^io@8BwKjR}hP1nN(MKm1cq2nzoj!e#sui27><-7M%y zh(rAeK_3&yfRVGSSD(F=PA| xPRHQ&N$eM{J{C{o{}JmsQ!w(CtyjFM!KeIDjbTf^s&(gS4*#(&pX-p*{{UliaU}o% literal 0 HcmV?d00001 diff --git a/build/Release/obj.target/nodeaudio/src/nodeaudio.o b/build/Release/obj.target/nodeaudio/src/nodeaudio.o new file mode 100644 index 0000000000000000000000000000000000000000..d77f7b9f1150b52450ca384a75ecc07f1495aa7d GIT binary patch literal 10076 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"): + lines[i] = None + lines[i - 1] = None + lines = '\n'.join(filter(lambda x: x is not None, lines)) + + # Write out the file with variables replaced. + fd = open(dest, 'w') + fd.write(lines) + fd.close() + + # Now write out PkgInfo file now that the Info.plist file has been + # "compiled". + self._WritePkgInfo(dest) + + if convert_to_binary == 'True': + self._ConvertToBinary(dest) + + def _WritePkgInfo(self, info_plist): + """This writes the PkgInfo file from the data stored in Info.plist.""" + plist = plistlib.readPlist(info_plist) + if not plist: + return + + # Only create PkgInfo for executable types. + package_type = plist['CFBundlePackageType'] + if package_type != 'APPL': + return + + # The format of PkgInfo is eight characters, representing the bundle type + # and bundle signature, each four characters. If that is missing, four + # '?' characters are used instead. + signature_code = plist.get('CFBundleSignature', '????') + if len(signature_code) != 4: # Wrong length resets everything, too. + signature_code = '?' * 4 + + dest = os.path.join(os.path.dirname(info_plist), 'PkgInfo') + fp = open(dest, 'w') + fp.write('%s%s' % (package_type, signature_code)) + fp.close() + + def ExecFlock(self, lockfile, *cmd_list): + """Emulates the most basic behavior of Linux's flock(1).""" + # Rely on exception handling to report errors. + fd = os.open(lockfile, os.O_RDONLY|os.O_NOCTTY|os.O_CREAT, 0o666) + fcntl.flock(fd, fcntl.LOCK_EX) + return subprocess.call(cmd_list) + + def ExecFilterLibtool(self, *cmd_list): + """Calls libtool and filters out '/path/to/libtool: file: foo.o has no + symbols'.""" + libtool_re = re.compile(r'^.*libtool: file: .* has no symbols$') + libtool_re5 = re.compile( + r'^.*libtool: warning for library: ' + + r'.* the table of contents is empty ' + + r'\(no object file members in the library define global symbols\)$') + env = os.environ.copy() + # Ref: + # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c + # The problem with this flag is that it resets the file mtime on the file to + # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone. + env['ZERO_AR_DATE'] = '1' + libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env) + _, err = libtoolout.communicate() + if PY3: + err = err.decode('utf-8') + for line in err.splitlines(): + if not libtool_re.match(line) and not libtool_re5.match(line): + print(line, file=sys.stderr) + # Unconditionally touch the output .a file on the command line if present + # and the command succeeded. A bit hacky. + if not libtoolout.returncode: + for i in range(len(cmd_list) - 1): + if cmd_list[i] == "-o" and cmd_list[i+1].endswith('.a'): + os.utime(cmd_list[i+1], None) + break + return libtoolout.returncode + + def ExecPackageFramework(self, framework, version): + """Takes a path to Something.framework and the Current version of that and + sets up all the symlinks.""" + # Find the name of the binary based on the part before the ".framework". + binary = os.path.basename(framework).split('.')[0] + + CURRENT = 'Current' + RESOURCES = 'Resources' + VERSIONS = 'Versions' + + if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)): + # Binary-less frameworks don't seem to contain symlinks (see e.g. + # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle). + return + + # Move into the framework directory to set the symlinks correctly. + pwd = os.getcwd() + os.chdir(framework) + + # Set up the Current version. + self._Relink(version, os.path.join(VERSIONS, CURRENT)) + + # Set up the root symlinks. + self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary) + self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES) + + # Back to where we were before! + os.chdir(pwd) + + def _Relink(self, dest, link): + """Creates a symlink to |dest| named |link|. If |link| already exists, + it is overwritten.""" + if os.path.lexists(link): + os.remove(link) + os.symlink(dest, link) + + def ExecCompileXcassets(self, keys, *inputs): + """Compiles multiple .xcassets files into a single .car file. + + This invokes 'actool' to compile all the inputs .xcassets files. The + |keys| arguments is a json-encoded dictionary of extra arguments to + pass to 'actool' when the asset catalogs contains an application icon + or a launch image. + + Note that 'actool' does not create the Assets.car file if the asset + catalogs does not contains imageset. + """ + command_line = [ + 'xcrun', 'actool', '--output-format', 'human-readable-text', + '--compress-pngs', '--notices', '--warnings', '--errors', + ] + is_iphone_target = 'IPHONEOS_DEPLOYMENT_TARGET' in os.environ + if is_iphone_target: + platform = os.environ['CONFIGURATION'].split('-')[-1] + if platform not in ('iphoneos', 'iphonesimulator'): + platform = 'iphonesimulator' + command_line.extend([ + '--platform', platform, '--target-device', 'iphone', + '--target-device', 'ipad', '--minimum-deployment-target', + os.environ['IPHONEOS_DEPLOYMENT_TARGET'], '--compile', + os.path.abspath(os.environ['CONTENTS_FOLDER_PATH']), + ]) + else: + command_line.extend([ + '--platform', 'macosx', '--target-device', 'mac', + '--minimum-deployment-target', os.environ['MACOSX_DEPLOYMENT_TARGET'], + '--compile', + os.path.abspath(os.environ['UNLOCALIZED_RESOURCES_FOLDER_PATH']), + ]) + if keys: + keys = json.loads(keys) + for key, value in keys.items(): + arg_name = '--' + key + if isinstance(value, bool): + if value: + command_line.append(arg_name) + elif isinstance(value, list): + for v in value: + command_line.append(arg_name) + command_line.append(str(v)) + else: + command_line.append(arg_name) + command_line.append(str(value)) + # Note: actool crashes if inputs path are relative, so use os.path.abspath + # to get absolute path name for inputs. + command_line.extend(map(os.path.abspath, inputs)) + subprocess.check_call(command_line) + + def ExecMergeInfoPlist(self, output, *inputs): + """Merge multiple .plist files into a single .plist file.""" + merged_plist = {} + for path in inputs: + plist = self._LoadPlistMaybeBinary(path) + self._MergePlist(merged_plist, plist) + plistlib.writePlist(merged_plist, output) + + def ExecCodeSignBundle(self, key, resource_rules, entitlements, provisioning): + """Code sign a bundle. + + This function tries to code sign an iOS bundle, following the same + algorithm as Xcode: + 1. copy ResourceRules.plist from the user or the SDK into the bundle, + 2. pick the provisioning profile that best match the bundle identifier, + and copy it into the bundle as embedded.mobileprovision, + 3. copy Entitlements.plist from user or SDK next to the bundle, + 4. code sign the bundle. + """ + resource_rules_path = self._InstallResourceRules(resource_rules) + substitutions, overrides = self._InstallProvisioningProfile( + provisioning, self._GetCFBundleIdentifier()) + entitlements_path = self._InstallEntitlements( + entitlements, substitutions, overrides) + subprocess.check_call([ + 'codesign', '--force', '--sign', key, '--resource-rules', + resource_rules_path, '--entitlements', entitlements_path, + os.path.join( + os.environ['TARGET_BUILD_DIR'], + os.environ['FULL_PRODUCT_NAME'])]) + + def _InstallResourceRules(self, resource_rules): + """Installs ResourceRules.plist from user or SDK into the bundle. + + Args: + resource_rules: string, optional, path to the ResourceRules.plist file + to use, default to "${SDKROOT}/ResourceRules.plist" + + Returns: + Path to the copy of ResourceRules.plist into the bundle. + """ + source_path = resource_rules + target_path = os.path.join( + os.environ['BUILT_PRODUCTS_DIR'], + os.environ['CONTENTS_FOLDER_PATH'], + 'ResourceRules.plist') + if not source_path: + source_path = os.path.join( + os.environ['SDKROOT'], 'ResourceRules.plist') + shutil.copy2(source_path, target_path) + return target_path + + def _InstallProvisioningProfile(self, profile, bundle_identifier): + """Installs embedded.mobileprovision into the bundle. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple containing two dictionary: variables substitutions and values + to overrides when generating the entitlements file. + """ + source_path, provisioning_data, team_id = self._FindProvisioningProfile( + profile, bundle_identifier) + target_path = os.path.join( + os.environ['BUILT_PRODUCTS_DIR'], + os.environ['CONTENTS_FOLDER_PATH'], + 'embedded.mobileprovision') + shutil.copy2(source_path, target_path) + substitutions = self._GetSubstitutions(bundle_identifier, team_id + '.') + return substitutions, provisioning_data['Entitlements'] + + def _FindProvisioningProfile(self, profile, bundle_identifier): + """Finds the .mobileprovision file to use for signing the bundle. + + Checks all the installed provisioning profiles (or if the user specified + the PROVISIONING_PROFILE variable, only consult it) and select the most + specific that correspond to the bundle identifier. + + Args: + profile: string, optional, short name of the .mobileprovision file + to use, if empty or the file is missing, the best file installed + will be used + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + + Returns: + A tuple of the path to the selected provisioning profile, the data of + the embedded plist in the provisioning profile and the team identifier + to use for code signing. + + Raises: + SystemExit: if no .mobileprovision can be used to sign the bundle. + """ + profiles_dir = os.path.join( + os.environ['HOME'], 'Library', 'MobileDevice', 'Provisioning Profiles') + if not os.path.isdir(profiles_dir): + print('cannot find mobile provisioning for %s' % (bundle_identifier), file=sys.stderr) + sys.exit(1) + provisioning_profiles = None + if profile: + profile_path = os.path.join(profiles_dir, profile + '.mobileprovision') + if os.path.exists(profile_path): + provisioning_profiles = [profile_path] + if not provisioning_profiles: + provisioning_profiles = glob.glob( + os.path.join(profiles_dir, '*.mobileprovision')) + valid_provisioning_profiles = {} + for profile_path in provisioning_profiles: + profile_data = self._LoadProvisioningProfile(profile_path) + app_id_pattern = profile_data.get( + 'Entitlements', {}).get('application-identifier', '') + for team_identifier in profile_data.get('TeamIdentifier', []): + app_id = '%s.%s' % (team_identifier, bundle_identifier) + if fnmatch.fnmatch(app_id, app_id_pattern): + valid_provisioning_profiles[app_id_pattern] = ( + profile_path, profile_data, team_identifier) + if not valid_provisioning_profiles: + print('cannot find mobile provisioning for %s' % (bundle_identifier), file=sys.stderr) + sys.exit(1) + # If the user has multiple provisioning profiles installed that can be + # used for ${bundle_identifier}, pick the most specific one (ie. the + # provisioning profile whose pattern is the longest). + selected_key = max(valid_provisioning_profiles, key=lambda v: len(v)) + return valid_provisioning_profiles[selected_key] + + def _LoadProvisioningProfile(self, profile_path): + """Extracts the plist embedded in a provisioning profile. + + Args: + profile_path: string, path to the .mobileprovision file + + Returns: + Content of the plist embedded in the provisioning profile as a dictionary. + """ + with tempfile.NamedTemporaryFile() as temp: + subprocess.check_call([ + 'security', 'cms', '-D', '-i', profile_path, '-o', temp.name]) + return self._LoadPlistMaybeBinary(temp.name) + + def _MergePlist(self, merged_plist, plist): + """Merge |plist| into |merged_plist|.""" + for key, value in plist.items(): + if isinstance(value, dict): + merged_value = merged_plist.get(key, {}) + if isinstance(merged_value, dict): + self._MergePlist(merged_value, value) + merged_plist[key] = merged_value + else: + merged_plist[key] = value + else: + merged_plist[key] = value + + def _LoadPlistMaybeBinary(self, plist_path): + """Loads into a memory a plist possibly encoded in binary format. + + This is a wrapper around plistlib.readPlist that tries to convert the + plist to the XML format if it can't be parsed (assuming that it is in + the binary format). + + Args: + plist_path: string, path to a plist file, in XML or binary format + + Returns: + Content of the plist as a dictionary. + """ + try: + # First, try to read the file using plistlib that only supports XML, + # and if an exception is raised, convert a temporary copy to XML and + # load that copy. + return plistlib.readPlist(plist_path) + except: + pass + with tempfile.NamedTemporaryFile() as temp: + shutil.copy2(plist_path, temp.name) + subprocess.check_call(['plutil', '-convert', 'xml1', temp.name]) + return plistlib.readPlist(temp.name) + + def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix): + """Constructs a dictionary of variable substitutions for Entitlements.plist. + + Args: + bundle_identifier: string, value of CFBundleIdentifier from Info.plist + app_identifier_prefix: string, value for AppIdentifierPrefix + + Returns: + Dictionary of substitutions to apply when generating Entitlements.plist. + """ + return { + 'CFBundleIdentifier': bundle_identifier, + 'AppIdentifierPrefix': app_identifier_prefix, + } + + def _GetCFBundleIdentifier(self): + """Extracts CFBundleIdentifier value from Info.plist in the bundle. + + Returns: + Value of CFBundleIdentifier in the Info.plist located in the bundle. + """ + info_plist_path = os.path.join( + os.environ['TARGET_BUILD_DIR'], + os.environ['INFOPLIST_PATH']) + info_plist_data = self._LoadPlistMaybeBinary(info_plist_path) + return info_plist_data['CFBundleIdentifier'] + + def _InstallEntitlements(self, entitlements, substitutions, overrides): + """Generates and install the ${BundleName}.xcent entitlements file. + + Expands variables "$(variable)" pattern in the source entitlements file, + add extra entitlements defined in the .mobileprovision file and the copy + the generated plist to "${BundlePath}.xcent". + + Args: + entitlements: string, optional, path to the Entitlements.plist template + to use, defaults to "${SDKROOT}/Entitlements.plist" + substitutions: dictionary, variable substitutions + overrides: dictionary, values to add to the entitlements + + Returns: + Path to the generated entitlements file. + """ + source_path = entitlements + target_path = os.path.join( + os.environ['BUILT_PRODUCTS_DIR'], + os.environ['PRODUCT_NAME'] + '.xcent') + if not source_path: + source_path = os.path.join( + os.environ['SDKROOT'], + 'Entitlements.plist') + shutil.copy2(source_path, target_path) + data = self._LoadPlistMaybeBinary(target_path) + data = self._ExpandVariables(data, substitutions) + if overrides: + for key in overrides: + if key not in data: + data[key] = overrides[key] + plistlib.writePlist(data, target_path) + return target_path + + def _ExpandVariables(self, data, substitutions): + """Expands variables "$(variable)" in data. + + Args: + data: object, can be either string, list or dictionary + substitutions: dictionary, variable substitutions to perform + + Returns: + Copy of data where each references to "$(variable)" has been replaced + by the corresponding value found in substitutions, or left intact if + the key was not found. + """ + if isinstance(data, str): + for key, value in substitutions.items(): + data = data.replace('$(%s)' % key, value) + return data + if isinstance(data, list): + return [self._ExpandVariables(v, substitutions) for v in data] + if isinstance(data, dict): + return {k: self._ExpandVariables(data[k], substitutions) for k in data} + return data + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/build/nodeaudio.target.mk b/build/nodeaudio.target.mk new file mode 100644 index 0000000..d6d5c1c --- /dev/null +++ b/build/nodeaudio.target.mk @@ -0,0 +1,195 @@ +# This file is generated by gyp; do not edit. + +TOOLSET := target +TARGET := nodeaudio +DEFS_Debug := \ + '-DNODE_GYP_MODULE_NAME=nodeaudio' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DOPENSSL_NO_PINSHARED' \ + '-DOPENSSL_THREADS' \ + '-DBUILDING_NODE_EXTENSION' \ + '-DDEBUG' \ + '-D_DEBUG' \ + '-DV8_ENABLE_CHECKS' + +# Flags passed to all source files. +CFLAGS_Debug := \ + -O0 \ + -gdwarf-2 \ + -mmacosx-version-min=10.13 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Debug := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Debug := \ + -std=gnu++1y \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Debug := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Debug := + +INCS_Debug := \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/src \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/config \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/openssl/include \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/uv/include \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/zlib \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/v8/include \ + -I/usr/local/include + +DEFS_Release := \ + '-DNODE_GYP_MODULE_NAME=nodeaudio' \ + '-DUSING_UV_SHARED=1' \ + '-DUSING_V8_SHARED=1' \ + '-DV8_DEPRECATION_WARNINGS=1' \ + '-DV8_DEPRECATION_WARNINGS' \ + '-DV8_IMMINENT_DEPRECATION_WARNINGS' \ + '-D_DARWIN_USE_64_BIT_INODE=1' \ + '-D_LARGEFILE_SOURCE' \ + '-D_FILE_OFFSET_BITS=64' \ + '-DOPENSSL_NO_PINSHARED' \ + '-DOPENSSL_THREADS' \ + '-DBUILDING_NODE_EXTENSION' + +# Flags passed to all source files. +CFLAGS_Release := \ + -O3 \ + -gdwarf-2 \ + -mmacosx-version-min=10.13 \ + -arch x86_64 \ + -Wall \ + -Wendif-labels \ + -W \ + -Wno-unused-parameter + +# Flags passed to only C files. +CFLAGS_C_Release := \ + -fno-strict-aliasing + +# Flags passed to only C++ files. +CFLAGS_CC_Release := \ + -std=gnu++1y \ + -stdlib=libc++ \ + -fno-rtti \ + -fno-exceptions \ + -fno-strict-aliasing + +# Flags passed to only ObjC files. +CFLAGS_OBJC_Release := + +# Flags passed to only ObjC++ files. +CFLAGS_OBJCC_Release := + +INCS_Release := \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/include/node \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/src \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/config \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/openssl/openssl/include \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/uv/include \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/zlib \ + -I/Users/adgundersen/Library/Caches/node-gyp/14.17.0/deps/v8/include \ + -I/usr/local/include + +OBJS := \ + $(obj).target/$(TARGET)/src/nodeaudio.o \ + $(obj).target/$(TARGET)/src/audio_handler.o \ + $(obj).target/$(TARGET)/src/frame_buffer.o + +# Add to the list of files we specially track dependencies for. +all_deps += $(OBJS) + +# CFLAGS et al overrides must be target-local. +# See "Target-specific Variable Values" in the GNU Make manual. +$(OBJS): TOOLSET := $(TOOLSET) +$(OBJS): GYP_CFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) +$(OBJS): GYP_CXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE)) +$(OBJS): GYP_OBJCXXFLAGS := $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE)) $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE)) + +# Suffix rules, putting all outputs into $(obj). + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# End of this set of suffix rules +### Rules for final target. +LDFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.13 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Debug := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first + +LDFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first \ + -mmacosx-version-min=10.13 \ + -arch x86_64 \ + -L$(builddir) \ + -stdlib=libc++ + +LIBTOOLFLAGS_Release := \ + -undefined dynamic_lookup \ + -Wl,-no_pie \ + -Wl,-search_paths_first + +LIBS := \ + -lportaudio + +$(builddir)/nodeaudio.node: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE)) +$(builddir)/nodeaudio.node: LIBS := $(LIBS) +$(builddir)/nodeaudio.node: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE)) +$(builddir)/nodeaudio.node: TOOLSET := $(TOOLSET) +$(builddir)/nodeaudio.node: $(OBJS) FORCE_DO_CMD + $(call do_cmd,solink_module) + +all_deps += $(builddir)/nodeaudio.node +# Add target alias +.PHONY: nodeaudio +nodeaudio: $(builddir)/nodeaudio.node + +# Short alias for building this executable. +.PHONY: nodeaudio.node +nodeaudio.node: $(builddir)/nodeaudio.node + +# Add executable to "all" target. +.PHONY: all +all: $(builddir)/nodeaudio.node + diff --git a/node_modules/bindings/README.md b/node_modules/bindings/README.md new file mode 100644 index 0000000..585cf51 --- /dev/null +++ b/node_modules/bindings/README.md @@ -0,0 +1,97 @@ +node-bindings +============= +### Helper module for loading your native module's .node file + +This is a helper module for authors of Node.js native addon modules. +It is basically the "swiss army knife" of `require()`ing your native module's +`.node` file. + +Throughout the course of Node's native addon history, addons have ended up being +compiled in a variety of different places, depending on which build tool and which +version of node was used. To make matters worse, now the _gyp_ build tool can +produce either a _Release_ or _Debug_ build, each being built into different +locations. + +This module checks _all_ the possible locations that a native addon would be built +at, and returns the first one that loads successfully. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install bindings +``` + +Or add it to the `"dependencies"` section of your _package.json_ file. + + +Example +------- + +`require()`ing the proper bindings file for the current node version, platform +and architecture is as simple as: + +``` js +var bindings = require('bindings')('binding.node') + +// Use your bindings defined in your C files +bindings.your_c_function() +``` + + +Nice Error Output +----------------- + +When the `.node` file could not be loaded, `node-bindings` throws an Error with +a nice error message telling you exactly what was tried. You can also check the +`err.tries` Array property. + +``` +Error: Could not load the bindings file. Tried: + → /Users/nrajlich/ref/build/binding.node + → /Users/nrajlich/ref/build/Debug/binding.node + → /Users/nrajlich/ref/build/Release/binding.node + → /Users/nrajlich/ref/out/Debug/binding.node + → /Users/nrajlich/ref/Debug/binding.node + → /Users/nrajlich/ref/out/Release/binding.node + → /Users/nrajlich/ref/Release/binding.node + → /Users/nrajlich/ref/build/default/binding.node + → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node + at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) + at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + ... +``` + + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/bindings/bindings.js b/node_modules/bindings/bindings.js new file mode 100644 index 0000000..93dcf85 --- /dev/null +++ b/node_modules/bindings/bindings.js @@ -0,0 +1,166 @@ + +/** + * Module dependencies. + */ + +var fs = require('fs') + , path = require('path') + , join = path.join + , dirname = path.dirname + , exists = fs.existsSync || path.existsSync + , defaults = { + arrow: process.env.NODE_BINDINGS_ARROW || ' → ' + , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled' + , platform: process.platform + , arch: process.arch + , version: process.versions.node + , bindings: 'bindings.node' + , try: [ + // node-gyp's linked version in the "build" dir + [ 'module_root', 'build', 'bindings' ] + // node-waf and gyp_addon (a.k.a node-gyp) + , [ 'module_root', 'build', 'Debug', 'bindings' ] + , [ 'module_root', 'build', 'Release', 'bindings' ] + // Debug files, for development (legacy behavior, remove for node v0.9) + , [ 'module_root', 'out', 'Debug', 'bindings' ] + , [ 'module_root', 'Debug', 'bindings' ] + // Release files, but manually compiled (legacy behavior, remove for node v0.9) + , [ 'module_root', 'out', 'Release', 'bindings' ] + , [ 'module_root', 'Release', 'bindings' ] + // Legacy from node-waf, node <= 0.4.x + , [ 'module_root', 'build', 'default', 'bindings' ] + // Production "Release" buildtype binary (meh...) + , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ] + ] + } + +/** + * The main `bindings()` function loads the compiled bindings for a given module. + * It uses V8's Error API to determine the parent filename that this function is + * being invoked from, which is then used to find the root directory. + */ + +function bindings (opts) { + + // Argument surgery + if (typeof opts == 'string') { + opts = { bindings: opts } + } else if (!opts) { + opts = {} + } + opts.__proto__ = defaults + + // Get the module root + if (!opts.module_root) { + opts.module_root = exports.getRoot(exports.getFileName()) + } + + // Ensure the given bindings name ends with .node + if (path.extname(opts.bindings) != '.node') { + opts.bindings += '.node' + } + + var tries = [] + , i = 0 + , l = opts.try.length + , n + , b + , err + + for (; i (http://tootallnate.net)", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-bindings.git" + }, + "main": "./bindings.js", + "bugs": { + "url": "https://github.com/TooTallNate/node-bindings/issues" + }, + "homepage": "https://github.com/TooTallNate/node-bindings", + "license": "MIT" + +,"_resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" +,"_integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" +,"_from": "bindings@1.2.1" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d161c63 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "function_arguments", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..13f2e39 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "function_arguments", + "version": "0.0.0", + "description": "Node.js Addons Example #2", + "main": "binding.js", + "private": true, + "dependencies": { + "bindings": "~1.2.1" + }, + "scripts": { + "test": "node binding.js" + }, + "gypfile": true +} diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..53b7fab583bad3b4f5d80c379b8583fd1a83efca GIT binary patch literal 6148 zcmeHKT}#7I3_Y0>HU`>9AMY;^{0C*s2cP``bKM6Ms)fPc`_J{{CXCIh)fX9(l-zTh zCQa|TrD*`jbicX-3IHRj;$Y0-6VdCc9T~Xgk|_Be4d&Qlfmf_L-eEXL26XSPxnq0o z*fWmzuf`fX++z7qH_NJSDtZ=gAEY;W+Y^0-4YMrp!fbO?e2xu|pJo0owlD95?`Xp{ zuaDN=zt(fy!FZ-%AQ%V+e$N1Fw#sN?7-KLH3a#6pP{D&As2m4N6tCZZwZ>YG_is77^_5Hv7_j^73}w zeXB_^uoy&^7%6!1=+T3RA|8vTD72mwPd)VDLCY3YM1n*S*Wd5Wyv@rdxp^q^9hg7A znR&DGKC_$KkZ=F`<)6JoiEbk5;ylRtlU|~CDa9?KyE$h$D>XBI(t6c;Xro`58 z$4J(>!4s9rS+C@_P6?mSZ0#cx^HwOzGDE4rSqP-1Q|Eg16Z|qf^u8IFxW}}^s)y?F zP^oHA%U9c7o$K{Kr`LPP%!uOXfuvb)kLl3ssiNbRoeKALu9r6JO_});i+ek5+uv+8 zsJQ+GGof?6x6OJZW?bTU+OjqeC{^>{a{YpG{kc*YZ#|Ds&3ba?k|ge2LyzcE&h;bC zN==OC#?=ecr_bus&1kpi96M|IzDbs|8sMzdg;MNTcU>>ZbHkL;&zp$EKRN^HlYKQg z>wQU&N%f9>aU7zT~NLP}z08w0@lA+a+s6iGN!pIZ8?u?7)tq z?fXmD_5PywlsLZL=99X$`TLxjJpH0IF{$;5);ivkV@X-_V&X12N)PbP!*^IClFv?Z zJroUco#MF8^~YSxJXuD@Z*bhl_2sMjd$5n&Gn^$wpCNPQ9pVl$9#0GW{Qh`{X&>M^ z#krsJXsucq_1yeuVbLpaEa@K3vXAnS<)P!ppDKND<-?w(>BHy7xG%+7_CUnDO6&{U zp=HwUdX#$y!ZBSO+-Z$e5;+6}rt{O0%{%S}F&l|!-==0~27Klm^|Bm4bsO`p#rCKi7r z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bcLUkbdOZTys7{yBZk`dgOGu0DHNObyHeTNb7rPos!mdX`PqW7t->i^*OgD zeK&Az&%MakyHo88qkS~t%-J(Ij~efAd>~1bt`jA=Ez=Gr2DsGm zkuWBzpV0A9-7izaG{z+d?bzywa~*MB$MP{@dYwytxE;UI5qERk!?~C99?p9?^LFVj w&by8A5T!`%V4*^bozKbi#!pDPVrL`a=BY&IVNPP(*FveVi%;!MIYg8G1x_M`PXGV_ literal 0 HcmV?d00001 diff --git a/src/audio_handler.c b/src/audio_handler.c new file mode 100644 index 0000000..56c706f --- /dev/null +++ b/src/audio_handler.c @@ -0,0 +1,259 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "audio_handler.h" +#include "frame_buffer.h" + +bool sys_on; + +bool recording = false; +int write_to_o_buff = 0; +bool initialized = false; + +frame_buffer inputFrameBuffer; +frame_buffer outputFrameBuffer; + +typedef short SAMPLE; + +static int min_int (int a, int b) { + return (a < b) ? a : b; +} + +#define SAMPLE_RATE (16000) +#define BUFFER_mSECS (30) +#define FRAMES_PER_BUFFER (160 * (BUFFER_mSECS/10)) + + +/* input -> inputFrameBuffer */ +static int input_callback( const void* input, + void* output, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void* frameBuffer ) +{ + (void) output; + char *i_buf = (char *) input; + frame_buffer* fb = (frame_buffer*) frameBuffer; + + if (!recording) { + rewrite_frames_fb( fb, + i_buf, + framesPerBuffer*sizeof(SAMPLE) ); + } else { + rewrite_frames_fb( fb, + i_buf, + framesPerBuffer*sizeof(SAMPLE) ); + } + + return paContinue; + +} + + +/* outputFrameBuffer -> output */ +static int output_callback( const void *input, + void* output, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void* frameBuffer ) +{ + + (void) input; + char* o_buf = (char *) output; + frame_buffer* fb = (frame_buffer*) frameBuffer; + + if (write_to_o_buff == 0) { + + write_to_o_buff = 2; + + if (fb->frames_used > 0) { + + int frames_to_read = min_int( framesPerBuffer, + fb->frames_used ); + + /* read each frame in outputFrameBuffer and write to output */ + for (int i = 0; i < frames_to_read; i++) { + *((SAMPLE *)o_buf) = *((SAMPLE *) read_frame_at_cursor_fb(fb)); + o_buf += sizeof(SAMPLE); + } + + } else { + *((SAMPLE *)o_buf) = 0; + } + + write_to_o_buff = 0; + + } + + return paContinue; +} + + +static void setParameters( PaDeviceIndex device, + PaStreamParameters* parameters ) +{ + parameters->device = Pa_GetDefaultInputDevice(); + parameters->channelCount = 1; + parameters->hostApiSpecificStreamInfo = NULL; + parameters->suggestedLatency = Pa_GetDeviceInfo(device)->defaultHighInputLatency; +} + + +static PaError set_stream( int type, // 0 = input, 1 = output + PaStream* stream, + PaDeviceIndex device, + PaStreamCallback* callback, + void* frameBuffer ) +{ + PaError err; + PaStreamParameters streamParameters; + + setParameters(device, &streamParameters); + + if (type == 0) { + err = Pa_OpenStream( &stream, + NULL, + &streamParameters, + SAMPLE_RATE, + FRAMES_PER_BUFFER, + paClipOff, + callback, + frameBuffer ); + } else { + err = Pa_OpenStream( &stream, + &streamParameters, + NULL, + SAMPLE_RATE, + FRAMES_PER_BUFFER, + paClipOff, + callback, + frameBuffer ); + } + if (err != paNoError) return err; + + err = Pa_StartStream(stream); + + return err; +} + + +void AH_initialize() +{ + PaError err = paNoError; + + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; + PaDeviceIndex defaultOutputDevice; + PaDeviceIndex defaultInputDevice; + + PaStream* inputStream = NULL; + PaStream* outputStream = NULL; + + init_fb(&inputFrameBuffer); + init_fb(&outputFrameBuffer); + + sys_on = true; + + while (sys_on) { + + Pa_Initialize(); + + defaultInputDevice = Pa_GetDefaultInputDevice(); + defaultOutputDevice = Pa_GetDefaultOutputDevice(); + printf("Input: %i, Output: %i\n", defaultInputDevice, defaultOutputDevice); + + if (inputDevice != defaultInputDevice) { + inputDevice = defaultInputDevice; + err = set_stream( 0, + inputStream, + inputDevice, + &input_callback, + &inputFrameBuffer ); + } + + if (outputDevice != defaultOutputDevice) { + outputDevice = defaultOutputDevice; + err = set_stream( 1, + outputStream, + outputDevice, + &output_callback, + &outputFrameBuffer ); + } + + sleep(1); + + } + + Pa_AbortStream(inputStream); + Pa_AbortStream(outputStream); + + delete_fb(&inputFrameBuffer); + delete_fb(&outputFrameBuffer); + + Pa_Terminate(); + initialized = false; + +} + +void AH_terminate() +{ + printf("Terminating PA\n"); + sys_on = false; + + while(initialized) { + struct timespec t; + t.tv_sec = 0; + t.tv_nsec = 5000; + nanosleep(&t, &t); + } + +} + + +void AH_fillInputBuffer() +{ + recording = true; +} + + +void AH_resetInputBuffer(void* data, size_t* byte_length) +{ + size_t len = sizeof(inputFrameBuffer.data); + char audioData[len]; + data = audioData; // points to 0th el of audioData + byte_length = &len; + + for(int i = 0; i < (int) len; i++) { + audioData[i] = inputFrameBuffer.data[i]; + } + + recording = false; + clear_fb(&inputFrameBuffer); +} + + +void AH_feedOutputBuffer(void* data, size_t* byte_length) +{ + + // can't intert into buffer while it's being read from + while (write_to_o_buff == 2) { + struct timespec t; + t.tv_sec = 0; + t.tv_nsec = 5000; + nanosleep(&t, &t); + } + + write_to_o_buff = 1; + insert_frames_fb(&outputFrameBuffer, data, (int) &byte_length); + write_to_o_buff = 0; + +} + + diff --git a/src/audio_handler.h b/src/audio_handler.h new file mode 100644 index 0000000..1487dcd --- /dev/null +++ b/src/audio_handler.h @@ -0,0 +1,16 @@ +#ifndef AUDIO_HANDLER +#define AUDIO_HANDLER + + +void AH_initialize (); + +void AH_fillInputBuffer (); + +void AH_resetInputBuffer(void* data, size_t* byte_length); + +void AH_feedOutputBuffer(void* data, size_t* byte_length); + +void AH_terminate (); + + +#endif \ No newline at end of file diff --git a/src/audio_handler.o b/src/audio_handler.o new file mode 100644 index 0000000000000000000000000000000000000000..ee8487ac45365d4078abf6aa9d2f9d76c94e9e10 GIT binary patch literal 2936 zcma)8U1%It6uz7O#s2N8sa6r(2c?F(eGn-q1UEHPZ^2+_6B^KPJK3FWhVDrYU&f&Nt_r z@1DPzy*oGW{rO;<5Q$9!7p%=#gKfB^u^`W3Es*0eV$uf480~=!vW}R7))q2Clya>x zH@FY(&p4y`Tm zmJqM%I(GRa^Oag(Us%^Z_IHMju^x?0CSBjCnR8XGe8w*4m3p^_sTvk|!(}%1As#)0 zz3rck>M#6i-*Rb|t1#^Hmfd!$YWY40G z=YdTO@Dq^8+lLhuPz0@~qQ?JuKOnt3vc8;c824$1Y#2?(1;RzG_+12ZTOL9Zp7Bf6 z%J;i8Bax84ejs;6A~|soHtqI|WyY3YTlNQ9a;ocfbof=^{*jvZj9Z$s^c|8&|9q1J zpI`8ddA`?Wc*c#Ws_*qBs87iHY<6fS`QijsB)Gp6GX91%oKgB*uecjDm7I79WOU!6 zO~93lPXninmh>9Zo6`xFZc=IW+0@WXAsU|tLrKGYeLM&03+Wjv(mRhpwM80lJ01W$zu6KU21E3jKE_NiqtzX5%n_rsK1CBh>@F^Q8W;Rl|-@76a`vOIk z-ty3lo;vWVQ?-d}$Z3E)HE&YR9@!#3?7w}ow{{Z5M-t#k%{0-nv*slYh z1pWY|`o3lTOCaU_0*GI3=2ONgAkOE^IFRC=1yWoah_^3e0&!$#jsYqE5ynG6oYNWl z`B9#OtY?5!&psgKO9OG%>-f~#3Fw4b#xx^9+u;*QT(X!K37rR8CkNzLEYd?kZmoy! z@!zaBnJ@@$60uHf4h-LrAA0y*@e}JGuzwnQB)r%UC90=l`kfe`o>!FrQOtiirW-N- zcub#+=~hfX8pPX#XQ-td^XCIUdxdx_&{z5No?y$WRATyR)>k>ITdIO(<%2`(P_0m~ z96?6Ms#>l-)gs1%T`aD%RrFbRm_9s0noTF+I!oCsSE@zJ8Wk#pvsHzUGX=?woT|E~ zRNi#(9VAqrsk(5lt0LyC_gtuHxkBQ%sHGi_9$ub;hw>OSu(Q zQN!p!*Ke0?*EWmxIZFpU5>e5e%ja_73{UAmd&hEntb$o9y1`I-tkZTb?$T2TJ<%dh m)=Vca)LMF0RAHE`Rm*XM54Ebc +#include +#include + + +#include "frame_buffer.h" + +#define BYTES_PER_FRAME (2) +#define INITIAL_FRAME_COUNT (480*100) + + +#define ALPHA (2) + + + +void init_fb ( frame_buffer *fb ) { + fb->frames_used = 0; + fb->frames_free = INITIAL_FRAME_COUNT; + fb->data = (char *) malloc(BYTES_PER_FRAME*INITIAL_FRAME_COUNT); + fb->cursor = fb->data; +} + + +void delete_fb ( frame_buffer *fb ) { + fb->frames_used = 0; + fb->frames_free = 0; + fb->cursor = NULL; + free(fb->data); +} + + +void clear_fb ( frame_buffer *fb ) { + free(fb->data); + fb->data = (char *) malloc(BYTES_PER_FRAME*INITIAL_FRAME_COUNT); + fb->cursor = fb->data; + fb->frames_free = INITIAL_FRAME_COUNT; + fb->frames_used = 0; +} + + +void insert_frames_fb ( frame_buffer *fb, char *frame_data, int frames_len ) { + + int frames = frames_len / BYTES_PER_FRAME; + + int cursor_diff = fb->cursor - fb->data; + int data_len = (fb->frames_free+fb->frames_used)*BYTES_PER_FRAME; + + if (frames > fb->frames_free) { + fb->data = realloc(fb->data, (data_len+frames_len)*ALPHA); + fb->cursor = fb->data+cursor_diff; + + if (fb->frames_used*BYTES_PER_FRAME > data_len-cursor_diff) { + memmove(fb->data+data_len, fb->data, (fb->frames_used*BYTES_PER_FRAME)-(data_len-cursor_diff)); + } + fb->frames_used += frames; + fb->frames_free = fb->frames_used; + } + + data_len = (fb->frames_free+fb->frames_used)*BYTES_PER_FRAME; + if (fb->frames_used*BYTES_PER_FRAME > data_len-cursor_diff) { + memcpy(fb->data+((fb->frames_used*BYTES_PER_FRAME)-(data_len-cursor_diff)), frame_data, frames_len); + fb->frames_free -= frames; + fb->frames_used += frames; + return; + } + if (frames_len+(fb->frames_used*BYTES_PER_FRAME) > data_len-cursor_diff) { + int non_overlap = data_len - (cursor_diff+(fb->frames_used*BYTES_PER_FRAME)); + int overlap = frames_len - non_overlap; + memcpy(fb->cursor+(fb->frames_used*BYTES_PER_FRAME), frame_data, non_overlap); + memcpy(fb->data, &(frame_data[non_overlap]), overlap); + fb->frames_free -= frames; + fb->frames_used += frames; + return; + } + + memcpy(fb->cursor+(fb->frames_used*BYTES_PER_FRAME), frame_data, frames_len); + fb->frames_free -= frames; + fb->frames_used += frames; +} + + +void rewrite_frames_fb ( frame_buffer *fb, char *frame_data, int frames_len ) { + int frames = frames_len / BYTES_PER_FRAME; + + if (frames > (fb->frames_used + fb->frames_free)) { + fb->data = realloc(fb->data, frames_len*ALPHA); + fb->frames_free = frames; + fb->frames_used = frames; + } else { + fb->frames_free = fb->frames_free + fb->frames_used - frames; + fb->frames_used = frames; + } + memcpy(fb->data, frame_data, frames_len); + fb->cursor = fb->data; +} + + + +char* read_frame_at_cursor_fb ( frame_buffer *fb ) { + char *begin = fb->cursor; + int frames_free = fb->frames_free; + int frames_used = fb->frames_used; + char *data = fb->data; + + if (frames_used == 0) { + return NULL; + } + + fb->cursor += BYTES_PER_FRAME; + if (fb->cursor >= data + ((frames_free+frames_used)*BYTES_PER_FRAME)) { + fb->cursor = data; + } + + fb->frames_free += 1; + fb->frames_used -= 1; + + return begin; +} + + diff --git a/src/frame_buffer.h b/src/frame_buffer.h new file mode 100644 index 0000000..1822a1b --- /dev/null +++ b/src/frame_buffer.h @@ -0,0 +1,24 @@ +#ifndef FRAME_BUFFER +#define FRAME_BUFFER + + +typedef struct { + int frames_free, frames_used; + char *data, *cursor; +} frame_buffer; + + +void init_fb ( frame_buffer *fb ); + +void delete_fb ( frame_buffer *fb ); + +void clear_fb ( frame_buffer *fb ); + +void insert_frames_fb ( frame_buffer *fb, char *frame_data, int frames_len ); + +void rewrite_frames_fb ( frame_buffer *fb, char *frame_data, int frames_len ); + +char* read_frame_at_cursor_fb ( frame_buffer *fb ); + + +#endif diff --git a/src/frame_buffer.o b/src/frame_buffer.o new file mode 100644 index 0000000000000000000000000000000000000000..faa02f247642a2442146ceff8fcd5fbfd063af7c GIT binary patch literal 2716 zcmbtWPiSLB7@xO^+gIJ)7jO>>Vgm|piS-~TTNWhMJa$%$f0m8xrTfgjzS3gT)->66 z#bC9%FbtGEc=1*c(VGV^ih>&|w0O|29_*oqC{bFBknY8|MYsOGnR!Y2Cn`8F`Mz(y zZ@xdj`QA*v+xh)Y4`Wu0;RiF0`57@uOpN<6Pm|nbG>>Y0M zYx#nE@j_dUxQFi29QmVMR&Bkb(F9dqk^Y-SqY5duy&Kt&Glcv+t=M-n_8utlFJg8M%9ExE-KqLlKF7r`e4&xxq7riHhAU}8lPQ+Xf5F&S zY}R6%dMz7rF=UgD%QUEx6MW(8#PG7yH%~_Y=udmW?v-?+#mhNcyH{@Z@8^;FKjcB_ ztDHLvQC>$MbNb$)h*5rNRj(*FMXn*;#`~WW-hbQ{?k1OIRCgu8B?0oL&HL|&a-AgE zL%*@J@oLQyZcUPHB|OvPEPjm58kIR)W^1u*qxzG@{cQtV4zNAlhRx5_xwXcnT1Ff< zlst|N8R^zCDYu>(tU8NlS}p;!pRI9gRpBjPgQILHUy4_Mwq&K2s?_^;xc@yDD}1H8 zi=l$5z;Z2BuJ_;K{x>S2 za+CYH#=h97W0OK=WUt#_&4}LC0@BGKpRJSVcA(xa#9A|v*PO+V5E)3wEI`kNvKX)a zYFXR;tHRyDo|L;G+;s(>Jg*K(ssrJE$gLe59x|$I;B?ox_z`Anov2ViF0T@Tl=ud> zZi1|H@vX7q!d+GPwNma{1AT=0%+p9CI+6be48ElF@N&CZoxZ4FlU@5&fn5&e^El>m z7&|ez>MTCl%8mN*ux6B59FZFes5QgmTS>D^0v|U-cccy)>5AuIVUE6|=LiKZ&p}6> z{Vd%J$-UL!=2hRfs5IdS6VRzo&TUFt(1C;Daov)nwxM2MsMMJA?s3X)#SKB&makKV z2~Y61s`T-40XA|fv+FWfkL7CkNVtECTiYDCyiE@TY|uV9e=(%&rM*zK1eHvo7q%?H zfh0Ou&@JbN!^_yz9_KV`ZujI~Z8P?1 z7yU`&-+KK#v*r?3;#iM;9Z?>}`U9BZZMr*lcTIha4V_3_JMzqN^9CwA93M;WXuC9c zH4d?xfa0{VGxZ+okKVIsV`u6<)b2~zg@5X}rv5|i>abh-OWPS74%nRqPN-?%H{gjU zbzlsX0{$ewVCWCP2v7LHB~Y^e1TpX=4}1t}gI+WA5wpGo3e%(WhQ4BG+R&t- zAj<9yPzM{L{vdxONB#7KkwMgW3csX}`o%YLbpEuD^ijWnHUBNZU^tkx7L5nNbjs8Z zo${mmWc&g03PHi2zUuj7uNtW^btTZ^XfX(wSIAFHO!>?!28J1*94~pJmzg&{ITIAY t(jTZ9wNeabi{qtW?^1q5%U-_Z`Q_rwR8iUb6G2{cBf&&Kn=Vrwe*=Li&lvy! literal 0 HcmV?d00001 diff --git a/src/makefile b/src/makefile new file mode 100644 index 0000000..2fa182f --- /dev/null +++ b/src/makefile @@ -0,0 +1,26 @@ +IDIR =../include +CC=gcc +CFLAGS=-I$(IDIR) + +ODIR=obj +LDIR =-L/usr/local/lib -L/usr/lib + +LIBS=-lportaudio + +_DEPS = audio_handler.h frame_buffer.h +DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) + +_OBJ = audio_handler.o frame_buffer.o +OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) + + +$(ODIR)/%.o: %.c $(DEPS) + $(CC) -c -o $@ $< $(CFLAGS) + +nodeaudio: $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) $(LDIR) $(LIBS) + +.PHONY: clean + +clean: + rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ \ No newline at end of file diff --git a/src/nodeaudio b/src/nodeaudio new file mode 100755 index 0000000000000000000000000000000000000000..39e3b57a59a5b1f78d3b8ee6e53459d9613aa4d9 GIT binary patch literal 51304 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 +#include +#include + +#include "audio_handler.h" + + +#define DECLARE_NAPI_METHOD(name, func) { name, 0, func, 0, 0, 0, napi_default, 0 } + +napi_value Initialize(napi_env env, napi_callback_info info) +{ + (void) info; + AH_initialize(); + return NULL; +} + +napi_value FillInputBuffer(napi_env env, napi_callback_info info) +{ + (void) info; + AH_fillInputBuffer(); + return NULL; +} + + +napi_value ReturnInputBuffer(napi_env env, napi_callback_info info) +{ + (void) info; + napi_status status; + void* data; + size_t byte_length; + + AH_resetInputBuffer(&data, &byte_length); + + napi_value buffer; + status = napi_create_arraybuffer( env, + byte_length, + &data, + &buffer ); + assert(status == napi_ok); + + return buffer; +} + + +static napi_value FeedOutputBuffer(napi_env env, napi_callback_info info) +{ + napi_status status; + void* data; + size_t byte_length; + napi_value arraybuffer; + + size_t argc = 1; /* parse args */ + napi_value args[1]; + status = napi_get_cb_info(env, info, &argc, args, NULL, NULL); + assert(status == napi_ok); + + arraybuffer = args[0]; + + status = napi_get_arraybuffer_info( env, + arraybuffer, + &data, + &byte_length ); + assert(status == napi_ok); + + AH_feedOutputBuffer(data, &byte_length); + return NULL; +} + + +napi_value Init(napi_env env, napi_value exports) +{ + napi_status status; + + napi_property_descriptor desc[] = { + DECLARE_NAPI_METHOD("fill_input_buffer", FillInputBuffer), + DECLARE_NAPI_METHOD("return_input_buffer", ReturnInputBuffer), + DECLARE_NAPI_METHOD("feed_output_buffer", FeedOutputBuffer) + }; + + status = napi_define_properties(env, exports, 1, desc); + + AH_initialize(); + + return exports; + +} + + +NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) + diff --git a/src/test.c b/src/test.c new file mode 100644 index 0000000..93a9732 --- /dev/null +++ b/src/test.c @@ -0,0 +1,44 @@ +#include +#include +#include +// #include "audio_handler.h" + +#include + +// int main() { +// printf("PA init test.\n"); + +// pthread_t in_th; +// printf("Creating audio thread.\n"); +// pthread_create(&in_th, NULL, (void *) AH_initialize, NULL); + +// sleep(10); + +// AH_terminate(); + +// return 0; + +// } + + +int main () +{ + + printf("Initializing portaudio\n"); + Pa_Initialize(); + + for (int i = 0; i < 10; ++i) + { + PaHostApiIndex hostApi = Pa_GetDefaultHostApi(); + const PaHostApiInfo* hostApiInfo = Pa_GetHostApiInfo(hostApi); + + printf("Default input id: %i\n", hostApiInfo->defaultInputDevice); + + sleep(2); + } + + Pa_Terminate(); + + return 0; + +} \ No newline at end of file -- 2.43.0