Git Product home page Git Product logo

soundengine's Introduction

Soundengine

A C++ addon for node.js that allows interacting with soundcards to e.g. play, record or process live microphone samples and send them back to the speakers. The module uses PortAudio to interact with the different host apis.

Prerequisites

Soundengine requires the shared portaudio library.

MacOS (via homebrew)

$ brew install portaudio fftw

Ubuntu (with apt-get)

$ sudo apt-get install libasound-dev libportaudio2 portaudio19-dev libfftw3-3 libfftw3-dev libfftw3-double3

Windows

...not supported yet.

Installation

$ npm i soundengine

Basic usage example

const soundengine = require('soundengine')

// Start live transmission from the default input device to the default output device at 22kHz
var engine = new soundengine.engine({sampleRate: 22050})

// Start recording
engine.startRecording()

// Apply a beep to the output when recording has stopped
engine.on('recording_stopped', () => {
    engine.beep({frequency: 300})
})

// Stop recording after 5 seconds
setTimeout(() => {
    // Stop the recording
    engine.stopRecording()

    // Playback of the recording
    engine.startPlayback()
}, 5000)

// Let the programm run forever
process.stdin.resume()

Api

Devices

To list the available devices

const soundengine = require('soundengine')
var devices = soundengine.getDevices()

Device properties

Engine options

Property Type Description
id number The device id to use in the engine options.
name string The device name.
defaultSampleRate number The default sample rate of the device.
maxInputChannels number The maximum supported input channels for this device.
maxOutputChannels number The maximum supported output channels for this device.
defaultLowInputLatency number See PortAudio docs
defaultLowOutputLatency number See PortAudio docs
defaultHighInputLatency number See PortAudio docs
defaultHighOutputLatency number See PortAudio docs

Engine methods

The engine class actually has almost all the methods of a nodejs EventEmitter to interact with the upcomming events. Furthermore these methods exist:

  • loadRecording(file: string) - Loads a wave file that is then playable with startPlayback(). (1)
  • startPlayback() - Starts playback of the last recording or loaded file.
  • stopPlayback() - Stops playback.
  • pausePlayback() - Pauses playback.
  • isPlaying(): boolean - Returns if playback is active.
  • startRecording() - Starts recording.
  • stopRecording() - Stops recording.
  • deleteRecording() - Deletes the recording that is currently held in memory.
  • saveRecording(file: string) - Saves the recording to a wave file. (2)
  • isRecording(): boolean - Returns if recording is active.
  • getRecordingSamples(): number - Return the number of total samples.
  • getPlaybackPosition(): number - Returns the current sample index of the playback.
  • getRecordingSampleAt(index: number): number - Returns a specific sample (between -1..1) at index.
  • getPlaybackProgress(): number - Returns the relative playback progress (between 0..1).
  • setPlaybackProgress(progress: number) - Sets the relative playback progress (between 0..1).
  • beep(options?: beepOptions) - Applies a beep to the output.
  • getVolume(): number - Returns the volume (between 0..1).
  • setVolume(volume: number) - Sets the volume (between 0..1).
  • getMute(): boolean - Returns if the output is muted or not.
  • setMute(mute?: boolean) - Mutes or unmutes the output.
  • getOptions(): engineOptions - Returns the current engine options.
  • setOptions(options?: engineOptions) - Sets the engine options.
  • synchronize() - Clears the internal buffer queues. If there for example is a large delay between the input and the output after initializing a new engine, calling synchronize could potentially minimize this delay.

Notes:
(1) Currently only 32bit floating point waves with the same samplerate of the current engine can be loaded (and the header will not be checked).
(2) The wave files are 32bit floating point.

Engine options

Option Type Default Description
sampleRate number 44100 Samples per second for each channel.
bufferSize number 1024 The count of samples for each processing iteration.
inputChannels number 1 The number of input channels.
outputChannels number 1 The number of output channels (should equal inputChannels).
inputDevice number default input device The id of the input device to use or -1 for a output only stream.
outputDevice number default output device The id of the output device to use or -1 for a input only stream.
inputLatency number default high input latency See PortAudio docs
outputLatency number default high output latency See PortAudio docs

Beep options

Option Type Default Description
duration number 200 The duration of the applied beep in ms.
frequency number 700 The frequency of the beep (sine wave).
level number 1.0 The volume of the beep (between 0..1).

Engine events

EventName Signature Description
data (inputBuffer: number[]): number[] Will be called when a new inputBuffer is available to be processed and returned. Note: If the processing function takes to long to process the buffer you might experience dropouts.
info ({min: number[], max: number[]}) This event gets fired with messurements of the inputBuffer such as peaks (min) for every channel.
playback_started Gets fired when playback started.
playback_stopped Gets fired when playback stopped.
playback_paused Gets fired when playback paused.
playback_progress (progress: number) Gets fired when playback progressed with the relative progress.
playback_finished Gets fired when playback reached the end of the recording or loaded wave.
recording_loaded Gets fired when the loadRecording loaded a file successfully.
recording_started Gets fired when recording started.
recording_stopped Gets fired when recording stopped.
recording_progress Gets fired when recording progressed.
recording_saved Gets fired when the recording was saved with saveRecording.
recording_deleted Gets fired when the recording in memory was deleted.
beep_started Gets fired when the beep method started apply a beep to the output.
beep_stopped Gets fired when the beep method stopped apply a beep to the output.

Todos

  • Implement fft stuff

soundengine's People

Contributors

mmende avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

donovan68

soundengine's Issues

[REQ] fix license file

Hi there, 1st of all thanks for your cool work !

Since we've "doxed" it in our HyMPS project (under the AUDIO \ Libraries \ Others subsection), can you replace the license with a "GH-compliant" one ?

Although it may sounds like a minor aspect, a "uncompliant" license file causes an inconsistent generation of the relative badge:


(badge-generator URL: https://flat.badgen.net/github/license/mmende/soundengine/?label=LICENSE)

You can easily set a "correct" (= compliant) one through the GH's license wizard tool.

Last but not least, let us know how - in your opinion - we could improve categorization/sorting of collected projects in order to push their evolution by favouring collaborations between developers (and not only).

Thanks in advance.

Possibility to Capture Speaker Input

I've been scouring the web to find a NodeJs library that could interact with the soundcard to record audio that is coming from an output device such as speakers so that I could send it over to another application and play it there. Does this framework have that capability? If so how could this be accomplished? If not, does anyone know one that can?

Underflow detected... on rpi

I'm trying running this to record realtime audio and perform a fft on a raspberry pi.
constantly getting 'Underflow detected...' error. any suggestion on how to solve it?

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.