Label Bauer stereophonic-to-binaural DSP: library description.

· Description · License · Download



The bs2b library is simple to use. See tables 1 and 2 for example. It is a reductive code of 'bs2bstream.c'. The 'bs2b.h' and 'bs2bclass.h' files of the source code package can help also.
There is a more complex example available on-line.

Table 1. Example of using of bs2b library (C).
#include <stdio.h>
#include "bs2b.h"

int main()
{
  t_bs2bdp bs2bdp;
  short sample[ 2 ];

  bs2bdp = bs2b_open();

  /* Default init value
  bs2b_set_srate( bs2bdp, 44100 );
  bs2b_set_level( bs2bdp, BS2B_DEFAULT_CLEVEL ); // 700 Hz, 4.5 dB
  // or another way
  bs2b_set_srate( bs2bdp, 44100 );
  bs2b_set_level_fcut( bs2bdp, 700 ); // 700 Hz
  bs2b_set_level_feed( bs2bdp, 45 );  // 4.5 dB
  */

  /* raw LPCM, signed 16 bit, native to CPU byte order, stereo interleaved */
  while( 2 == fread( sample, sizeof( short ), 2, stdin ) )
  {
    bs2b_cross_feed_s16( bs2bdp, sample, 1 );
    fwrite( sample, sizeof( short ), 2, stdout );
  }

  bs2b_close( bs2bdp );
  bs2bdp = 0;

  return 0 ;
}

Sample rate default value is 44100 Hz. Crossfeed level default value is 700 Hz, 4.5 dB. If a sample rate of audio data is different or if you want to change crossfeed level then you must call 'bs2b_set_srate' and 'bs2b_set_level' functions (or 'bs2b_set_srate', 'bs2b_set_level_fcut', 'bs2b_set_level_feed') accordingly.


Table 2. Example of using of bs2b library (C++).
#include <stdio.h>
#include "bs2bclass.h"

int main()
{
  bs2b_base bs2b;

  // Default init value
  //bs2b.set_srate( 44100 );
  //bs2b.set_level( BS2B_DEFAULT_CLEVEL ); // 700 Hz, 4.5 dB
  // or another way
  //bs2b.set_srate( 44100 );
  //bs2b.set_level_fcut( 700 ); // 700 Hz
  //bs2b.set_level_feed( 45 );  // 4.5 dB

  // raw LPCM, signed 16 bit, native to CPU byte order, stereo interleaved
  short sample[ 2 ];
  while( 2 == fread( sample, sizeof( short ), 2, stdin ) )
  {
    bs2b.cross_feed( sample );
    fwrite( sample, sizeof( short ), 2, stdout );
  }

  return 0 ;
}

You can use a 'bs2bstream' with 'lame' by a command line like this:
  lame -t --decode test.wav - | bs2bstream | lame -r -x -m j -s 44.1 --bitwidth 16 --preset extreme - test.mp3
or without of '-x' swap bytes of input file, like this:
  lame -t --decode test.wav - | bs2bstream | lame -r -m j -s 44.1 --bitwidth 16 --preset extreme - test.mp3

There is a bash script below for example of using of bs2bstream.

Table 3. Example of using of bs2bstream (bash).
#!/bin/bash
#     FLAC player using the bs2b DSP
#
#     (c) 2011 Bart Lauret
#
#     This program is free software; you can redistribute it and/or modify
#       it under the terms of the GNU General Public License as published by
#       the Free Software Foundation; either version 2 of the License, or
#       (at your option) any later version.
#
#     This program is distributed in the hope that it will be useful,
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#       along with this program; if not, write to the Free Software
#       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


# Do not loop though files when no flac exists:
shopt -s nullglob

# Change this to your soundcard's address
# If your soundcard supports S16_LE and S24_3LE, use hw:X,X to circumvent software resampling
DEVICE="plughw:0,0"

function checkplay {
    if [ `soxi -V0 -c "$FILE"` -eq "2" ]; then
   
        RATE=`soxi -V0 -r "$FILE"`
        RATEKHZ=`echo "scale=1 ; $RATE / 1000" | bc`
       
        case `soxi -V0 -b "$FILE"` in
            16) play16;;
            24) play24;;
            *)  echo "File format not supported: use FLACs with 16 or 24 bit resolution.";;
        esac
       
    else
        echo "File is mono, crossfeed not possible..."
    fi
}

function play16 {
    echo "*** Playing $FILE... (16 bit/$RATEKHZ kHz)"
    if [ "$CROSSFEED" ]; then
        flac --endian=little --sign=signed --force-raw-format --totally-silent -dc "$FILE" | \
        bs2bstream -e l -b 16 -r "$RATEKHZ" -l "$CROSSFEED" | \
        aplay -c 2 -r "$RATE" -f S16_LE -D "$DEVICE" -t raw --quiet
    else
        echo "*** No crossfeed selected, playing without..."
        flac --totally-silent -dc "$FILE" | \
        aplay -c 2 -r "$RATE" -f S16_LE -D "$DEVICE" -t wav --quiet
    fi
}

function play24 {
    echo "*** Playing $FILE... (24 bit/$RATEKHZ kHz)"
    if [ "$CROSSFEED" ]; then
        flac --endian=little --sign=signed --force-raw-format --totally-silent -dc "$FILE" | \
        bs2bstream -e l -b 24 -r "$RATEKHZ" -l "$CROSSFEED" | \
        aplay -c 2 -r "$RATE" -f S24_3LE -D "$DEVICE" -t raw --quiet
    else
        echo "*** No crossfeed selected, playing without..."
        flac --totally-silent -dc "$FILE" | \
        aplay -c 2 -r "$RATE" -f S24_3LE -D "$DEVICE" -t wav --quiet
    fi
}

function usage {
    echo "Usage:"
    echo "Play a single file: bs2b [-dcm] -f <filename>"
    echo "Play all FLACs in a directory: bs2b [-dcm] -D"
    echo
    echo "    -d - default preset     - 700Hz/260us, 4.5 dB;"
    echo "    -c - Chu Moy's preset   - 700Hz/260us, 6.0 dB;"
    echo "    -m - Jan Meier's preset - 650Hz/280us, 9.5 dB."
    echo
}


# Script starts here
echo "bs2b - FLAC player with Bauer stereophonic-to-binaural DSP"
echo "bs2b comes with ABSOLUTELY NO WARRANTY.  This is free software, and you are"
echo "welcome to redistribute it under certain conditions."
echo

if [ ! `which soxi` ]; then
    echo "Please install sox. For more information see http://sox.sourceforge.net/"
    if [ ! `which flac` ]; then
        echo "Please install flac. For more information see http://flac.sourceforge.net/"
    fi
    exit 1
fi

while getopts  "dcmDf:" flag
do

  case "$flag" in
        d) CROSSFEED="$flag"; echo "*** Crossfeed set to default preset.";;
        c) CROSSFEED="$flag"; echo "*** Crossfeed set to Chu Moy's preset.";;
        m) CROSSFEED="$flag"; echo "*** Crossfeed set to Jan Meier's preset.";;
        D) DIR="$OPTIND";;
        f) FILE="$OPTARG"

  esac

done

if [ -f "$FILE" ]; then
    checkplay
elif [ $DIR ]; then
    for FILE in *.flac
    do
         checkplay
    done

else
    usage
    exit 1
fi


Hosted at Get Bauer stereophonic-to-binaural DSP at SourceForge.net. Fast, secure and Free Open Source software downloads

© Boris Mikhaylov