mirror of
				https://github.com/alsa-project/alsa-tools.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "master" and "v1.0.22" have entirely different histories.
		
	
	
		
	
		
					 406 changed files with 18436 additions and 13312 deletions
				
			
		
							
								
								
									
										142
									
								
								.github/workflows/build.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										142
									
								
								.github/workflows/build.yml
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,142 +0,0 @@
 | 
				
			||||||
name: Build alsa-tools
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
on: [push, pull_request]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
jobs:
 | 
					 | 
				
			||||||
  fedora_latest_build:
 | 
					 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					 | 
				
			||||||
    container:
 | 
					 | 
				
			||||||
      image: fedora:latest
 | 
					 | 
				
			||||||
    env:
 | 
					 | 
				
			||||||
      QTDIR: /usr/lib64/qt-3.3
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
    - name: Prepare environment
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        dnf -y upgrade
 | 
					 | 
				
			||||||
        dnf -y install @development-tools gcc-c++ libtool bzip2 gtk2-devel gtk3-devel fltk-devel qt3-devel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Checkout alsa-lib
 | 
					 | 
				
			||||||
      uses: actions/checkout@v4
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        repository: alsa-project/alsa-lib
 | 
					 | 
				
			||||||
        ref: master
 | 
					 | 
				
			||||||
        path: alsa-lib
 | 
					 | 
				
			||||||
    - name: Configure alsa-lib
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-lib
 | 
					 | 
				
			||||||
        head -5 configure.ac
 | 
					 | 
				
			||||||
        libtoolize --force --copy --automake
 | 
					 | 
				
			||||||
        aclocal
 | 
					 | 
				
			||||||
        autoheader
 | 
					 | 
				
			||||||
        automake --foreign --copy --add-missing
 | 
					 | 
				
			||||||
        autoconf
 | 
					 | 
				
			||||||
        export CFLAGS="-O2 -Wall -W -Wunused-const-variable=0 -pipe -g"
 | 
					 | 
				
			||||||
        ./configure
 | 
					 | 
				
			||||||
        echo "Version: $(cat version)"
 | 
					 | 
				
			||||||
    - name: Build alsa-lib
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-lib
 | 
					 | 
				
			||||||
        make
 | 
					 | 
				
			||||||
    - name: Install alsa-lib
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-lib
 | 
					 | 
				
			||||||
        make install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Checkout
 | 
					 | 
				
			||||||
      uses: actions/checkout@v4
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        path: alsa-tools
 | 
					 | 
				
			||||||
    - name: Checkout all tags
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-tools
 | 
					 | 
				
			||||||
        git fetch --prune --tags --force
 | 
					 | 
				
			||||||
        git fetch --prune --unshallow --force
 | 
					 | 
				
			||||||
    - name: Modify version
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-tools
 | 
					 | 
				
			||||||
        mv Makefile Makefile.old
 | 
					 | 
				
			||||||
        version=$(git describe | sed -e 's/v//')
 | 
					 | 
				
			||||||
        if test -z "$version"; then version=$(git describe --tags | sed -e 's/v//'); fi
 | 
					 | 
				
			||||||
        if test -z "$version"; then version1=$(grep "VERSION = .*" Makefile.old | cut -d ' ' -f 3); version2=$(git rev-parse --short HEAD); version="${version1}-g${version2}"; fi
 | 
					 | 
				
			||||||
        echo "Version: ${version}"
 | 
					 | 
				
			||||||
        sed -r "s/VERSION = .*/VERSION = ${version}/" < Makefile.old > Makefile
 | 
					 | 
				
			||||||
        grep "VERSION =" Makefile
 | 
					 | 
				
			||||||
    - name: Compile and install as10k1 (dependency)
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-tools/as10k1
 | 
					 | 
				
			||||||
        ./gitcompile --prefix=/usr
 | 
					 | 
				
			||||||
        make install
 | 
					 | 
				
			||||||
    - name: Compile and install ld10k1 (dependency)
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-tools/ld10k1
 | 
					 | 
				
			||||||
        ./gitcompile --prefix=/usr
 | 
					 | 
				
			||||||
        make install
 | 
					 | 
				
			||||||
    - name: Configure and build
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-tools
 | 
					 | 
				
			||||||
        ./gitcompile
 | 
					 | 
				
			||||||
    - name: Create package
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd alsa-tools
 | 
					 | 
				
			||||||
        make alsa-dist
 | 
					 | 
				
			||||||
        mkdir ../artifacts
 | 
					 | 
				
			||||||
        mv alsa-tools*.tar.bz2 ../artifacts
 | 
					 | 
				
			||||||
    - name: Archive package
 | 
					 | 
				
			||||||
      uses: actions/upload-artifact@v4
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        name: alsa-tools-test-package
 | 
					 | 
				
			||||||
        path: artifacts/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ubuntu_last_build:
 | 
					 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					 | 
				
			||||||
    container:
 | 
					 | 
				
			||||||
      image: ubuntu:latest
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
    - name: Prepare
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        export DEBIAN_FRONTEND=noninteractive
 | 
					 | 
				
			||||||
        apt-get update
 | 
					 | 
				
			||||||
        apt-get -y install apt-utils
 | 
					 | 
				
			||||||
        apt-get -y full-upgrade
 | 
					 | 
				
			||||||
        apt-get install -y git build-essential pkg-config m4 autoconf automake libtool ibgtk2.0-dev libgtk-3-dev libfltk1.3-dev
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Checkout alsa-lib
 | 
					 | 
				
			||||||
      uses: actions/checkout@v4
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        repository: alsa-project/alsa-lib
 | 
					 | 
				
			||||||
        ref: master
 | 
					 | 
				
			||||||
    - name: Configure alsa-lib
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        libtoolize --force --copy --automake
 | 
					 | 
				
			||||||
        aclocal
 | 
					 | 
				
			||||||
        autoheader
 | 
					 | 
				
			||||||
        automake --foreign --copy --add-missing
 | 
					 | 
				
			||||||
        autoconf
 | 
					 | 
				
			||||||
        export CFLAGS="-O2 -Wall -W -Wunused-const-variable=0 -pipe -g"
 | 
					 | 
				
			||||||
        ./configure
 | 
					 | 
				
			||||||
    - name: Build alsa-lib
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        make
 | 
					 | 
				
			||||||
    - name: Install alsa-lib
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        make install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Checkout
 | 
					 | 
				
			||||||
      uses: actions/checkout@v4
 | 
					 | 
				
			||||||
    - name: Remove qlo10k1
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        mv Makefile Makefile.old
 | 
					 | 
				
			||||||
        sed -e 's/qlo10k1//' < Makefile.old > Makefile
 | 
					 | 
				
			||||||
    - name: Compile and install as10k1 (dependency)
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd as10k1
 | 
					 | 
				
			||||||
        ./gitcompile --prefix=/usr
 | 
					 | 
				
			||||||
        make install
 | 
					 | 
				
			||||||
    - name: Compile and install ld10k1 (dependency)
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        cd ld10k1
 | 
					 | 
				
			||||||
        ./gitcompile --prefix=/usr
 | 
					 | 
				
			||||||
        make install
 | 
					 | 
				
			||||||
    - name: Configure and build
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        ./gitcompile
 | 
					 | 
				
			||||||
							
								
								
									
										35
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -30,7 +30,6 @@ autom4te.cache
 | 
				
			||||||
stamp-h1
 | 
					stamp-h1
 | 
				
			||||||
version
 | 
					version
 | 
				
			||||||
distdir
 | 
					distdir
 | 
				
			||||||
*/compile
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ac3dec/Makefile
 | 
					ac3dec/Makefile
 | 
				
			||||||
ac3dec/ac3dec
 | 
					ac3dec/ac3dec
 | 
				
			||||||
| 
						 | 
					@ -46,38 +45,24 @@ as10k1/configure
 | 
				
			||||||
echomixer/echomixer
 | 
					echomixer/echomixer
 | 
				
			||||||
echomixer/Makefile
 | 
					echomixer/Makefile
 | 
				
			||||||
echomixer/configure
 | 
					echomixer/configure
 | 
				
			||||||
echomixer/desktop/Makefile
 | 
					 | 
				
			||||||
envy24control/Makefile
 | 
					envy24control/Makefile
 | 
				
			||||||
envy24control/configure
 | 
					envy24control/configure
 | 
				
			||||||
envy24control/desktop/Makefile
 | 
					 | 
				
			||||||
hdspconf/Makefile
 | 
					 | 
				
			||||||
hdspconf/configure
 | 
					 | 
				
			||||||
hdspconf/src/hdspconf
 | 
					hdspconf/src/hdspconf
 | 
				
			||||||
hdspconf/src/Makefile
 | 
					hdspconf/configure
 | 
				
			||||||
hdspconf/pixmaps/Makefile
 | 
					 | 
				
			||||||
hdspconf/desktop/Makefile
 | 
					 | 
				
			||||||
hdspmixer/Makefile
 | 
					 | 
				
			||||||
hdspmixer/configure
 | 
					 | 
				
			||||||
hdspmixer/src/hdspmixer
 | 
					hdspmixer/src/hdspmixer
 | 
				
			||||||
hdspmixer/pixmaps/Makefile
 | 
					hdspmixer/configure
 | 
				
			||||||
hdspmixer/desktop/Makefile
 | 
					 | 
				
			||||||
hdspmixer/src/Makefile
 | 
					 | 
				
			||||||
hdsploader/Makefile
 | 
					hdsploader/Makefile
 | 
				
			||||||
hdsploader/configure
 | 
					hdsploader/configure
 | 
				
			||||||
hwmixvolume/Makefile
 | 
					 | 
				
			||||||
hwmixvolume/configure
 | 
					 | 
				
			||||||
hwmixvolume/desktop/Makefile
 | 
					 | 
				
			||||||
ld10k1/Makefile
 | 
					ld10k1/Makefile
 | 
				
			||||||
 | 
					ld10k1/compile
 | 
				
			||||||
ld10k1/ld10k1d
 | 
					ld10k1/ld10k1d
 | 
				
			||||||
ld10k1/configure
 | 
					ld10k1/configure
 | 
				
			||||||
ld10k1/m4/
 | 
					 | 
				
			||||||
ld10k1/contrib/Makefile
 | 
					ld10k1/contrib/Makefile
 | 
				
			||||||
ld10k1/contrib/emu10k1MIDIEffects/Makefile
 | 
					ld10k1/contrib/emu10k1MIDIEffects/Makefile
 | 
				
			||||||
ld10k1/doc/Makefile
 | 
					ld10k1/doc/Makefile
 | 
				
			||||||
ld10k1/dump/Makefile
 | 
					ld10k1/dump/Makefile
 | 
				
			||||||
ld10k1/include/Makefile
 | 
					ld10k1/include/Makefile
 | 
				
			||||||
ld10k1/include/lo10k1
 | 
					ld10k1/include/lo10k1
 | 
				
			||||||
ld10k1/include/stamp-vh
 | 
					 | 
				
			||||||
ld10k1/setup/init_audigy
 | 
					ld10k1/setup/init_audigy
 | 
				
			||||||
ld10k1/setup/init_audigy_eq10
 | 
					ld10k1/setup/init_audigy_eq10
 | 
				
			||||||
ld10k1/setup/init_live
 | 
					ld10k1/setup/init_live
 | 
				
			||||||
| 
						 | 
					@ -93,16 +78,13 @@ mixartloader/Makefile
 | 
				
			||||||
mixartloader/configure
 | 
					mixartloader/configure
 | 
				
			||||||
pcxhrloader/Makefile
 | 
					pcxhrloader/Makefile
 | 
				
			||||||
pcxhrloader/configure
 | 
					pcxhrloader/configure
 | 
				
			||||||
qlo10k1/Makefile
 | 
					 | 
				
			||||||
qlo10k1/configure
 | 
					qlo10k1/configure
 | 
				
			||||||
qlo10k1/include
 | 
					qlo10k1/include
 | 
				
			||||||
qlo10k1/ld10k1
 | 
					qlo10k1/ld10k1
 | 
				
			||||||
qlo10k1/src/Makefile
 | 
					 | 
				
			||||||
qlo10k1/src/*.moc.cpp
 | 
					qlo10k1/src/*.moc.cpp
 | 
				
			||||||
qlo10k1/src/qlo10k1
 | 
					qlo10k1/src/qlo10k1
 | 
				
			||||||
qlo10k1/src/dlgs/*.cpp
 | 
					qlo10k1/src/dlgs/*.cpp
 | 
				
			||||||
qlo10k1/src/dlgs/*.h
 | 
					qlo10k1/src/dlgs/*.h
 | 
				
			||||||
qlo10k1/m4/
 | 
					 | 
				
			||||||
rmedigicontrol/Makefile
 | 
					rmedigicontrol/Makefile
 | 
				
			||||||
rmedigicontrol/configure
 | 
					rmedigicontrol/configure
 | 
				
			||||||
*control/*control
 | 
					*control/*control
 | 
				
			||||||
| 
						 | 
					@ -124,14 +106,3 @@ vxloader/Makefile
 | 
				
			||||||
vxloader/configure
 | 
					vxloader/configure
 | 
				
			||||||
usx2yloader/tascam_fpga
 | 
					usx2yloader/tascam_fpga
 | 
				
			||||||
usx2yloader/tascam_fw
 | 
					usx2yloader/tascam_fw
 | 
				
			||||||
hdajackretask/configure
 | 
					 | 
				
			||||||
hdajackretask/Makefile
 | 
					 | 
				
			||||||
hdajackretask/README.generated.h
 | 
					 | 
				
			||||||
hdajackretask/hdajackretask
 | 
					 | 
				
			||||||
hdajackretask/desktop/Makefile
 | 
					 | 
				
			||||||
hdajacksensetest/Makefile
 | 
					 | 
				
			||||||
hdajacksensetest/configure
 | 
					 | 
				
			||||||
hdajacksensetest/hdajacksensetest
 | 
					 | 
				
			||||||
hda-verb/Makefile
 | 
					 | 
				
			||||||
hda-verb/configure
 | 
					 | 
				
			||||||
hda-verb/hda-verb
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										9
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -1,9 +1,8 @@
 | 
				
			||||||
VERSION = 1.2.14
 | 
					VERSION = 1.0.22
 | 
				
			||||||
TOP = .
 | 
					TOP = .
 | 
				
			||||||
SUBDIRS = as10k1 envy24control hdsploader hdspconf hdspmixer \
 | 
					SUBDIRS = ac3dec as10k1 envy24control hdsploader hdspconf hdspmixer \
 | 
				
			||||||
	  mixartloader pcxhrloader rmedigicontrol sb16_csp seq sscape_ctl \
 | 
						  mixartloader pcxhrloader rmedigicontrol sb16_csp seq sscape_ctl \
 | 
				
			||||||
	  us428control usx2yloader vxloader echomixer ld10k1 qlo10k1 \
 | 
						  us428control usx2yloader vxloader echomixer ld10k1 qlo10k1
 | 
				
			||||||
	  hwmixvolume hdajackretask hda-verb hdajacksensetest
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
all:
 | 
					all:
 | 
				
			||||||
	@for i in $(SUBDIRS); do \
 | 
						@for i in $(SUBDIRS); do \
 | 
				
			||||||
| 
						 | 
					@ -29,7 +28,7 @@ install:
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
alsa-dist:
 | 
					alsa-dist:
 | 
				
			||||||
	@echo $(VERSION) > $(TOP)/version
 | 
						@echo $(VERSION) >> $(TOP)/version
 | 
				
			||||||
	@mkdir -p $(TOP)/distdir
 | 
						@mkdir -p $(TOP)/distdir
 | 
				
			||||||
	@for i in $(SUBDIRS); do \
 | 
						@for i in $(SUBDIRS); do \
 | 
				
			||||||
	  cd $(TOP)/$$i; echo $(TOP)/$$i; \
 | 
						  cd $(TOP)/$$i; echo $(TOP)/$$i; \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										340
									
								
								ac3dec/COPYING
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								ac3dec/COPYING
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,340 @@
 | 
				
			||||||
 | 
							    GNU GENERAL PUBLIC LICENSE
 | 
				
			||||||
 | 
							       Version 2, June 1991
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
				
			||||||
 | 
					                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 | 
					 Everyone is permitted to copy and distribute verbatim copies
 | 
				
			||||||
 | 
					 of this license document, but changing it is not allowed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								    Preamble
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The licenses for most software are designed to take away your
 | 
				
			||||||
 | 
					freedom to share and change it.  By contrast, the GNU General Public
 | 
				
			||||||
 | 
					License is intended to guarantee your freedom to share and change free
 | 
				
			||||||
 | 
					software--to make sure the software is free for all its users.  This
 | 
				
			||||||
 | 
					General Public License applies to most of the Free Software
 | 
				
			||||||
 | 
					Foundation's software and to any other program whose authors commit to
 | 
				
			||||||
 | 
					using it.  (Some other Free Software Foundation software is covered by
 | 
				
			||||||
 | 
					the GNU Library General Public License instead.)  You can apply it to
 | 
				
			||||||
 | 
					your programs, too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  When we speak of free software, we are referring to freedom, not
 | 
				
			||||||
 | 
					price.  Our General Public Licenses are designed to make sure that you
 | 
				
			||||||
 | 
					have the freedom to distribute copies of free software (and charge for
 | 
				
			||||||
 | 
					this service if you wish), that you receive source code or can get it
 | 
				
			||||||
 | 
					if you want it, that you can change the software or use pieces of it
 | 
				
			||||||
 | 
					in new free programs; and that you know you can do these things.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  To protect your rights, we need to make restrictions that forbid
 | 
				
			||||||
 | 
					anyone to deny you these rights or to ask you to surrender the rights.
 | 
				
			||||||
 | 
					These restrictions translate to certain responsibilities for you if you
 | 
				
			||||||
 | 
					distribute copies of the software, or if you modify it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  For example, if you distribute copies of such a program, whether
 | 
				
			||||||
 | 
					gratis or for a fee, you must give the recipients all the rights that
 | 
				
			||||||
 | 
					you have.  You must make sure that they, too, receive or can get the
 | 
				
			||||||
 | 
					source code.  And you must show them these terms so they know their
 | 
				
			||||||
 | 
					rights.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  We protect your rights with two steps: (1) copyright the software, and
 | 
				
			||||||
 | 
					(2) offer you this license which gives you legal permission to copy,
 | 
				
			||||||
 | 
					distribute and/or modify the software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Also, for each author's protection and ours, we want to make certain
 | 
				
			||||||
 | 
					that everyone understands that there is no warranty for this free
 | 
				
			||||||
 | 
					software.  If the software is modified by someone else and passed on, we
 | 
				
			||||||
 | 
					want its recipients to know that what they have is not the original, so
 | 
				
			||||||
 | 
					that any problems introduced by others will not reflect on the original
 | 
				
			||||||
 | 
					authors' reputations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Finally, any free program is threatened constantly by software
 | 
				
			||||||
 | 
					patents.  We wish to avoid the danger that redistributors of a free
 | 
				
			||||||
 | 
					program will individually obtain patent licenses, in effect making the
 | 
				
			||||||
 | 
					program proprietary.  To prevent this, we have made it clear that any
 | 
				
			||||||
 | 
					patent must be licensed for everyone's free use or not licensed at all.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The precise terms and conditions for copying, distribution and
 | 
				
			||||||
 | 
					modification follow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							    GNU GENERAL PUBLIC LICENSE
 | 
				
			||||||
 | 
					   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  0. This License applies to any program or other work which contains
 | 
				
			||||||
 | 
					a notice placed by the copyright holder saying it may be distributed
 | 
				
			||||||
 | 
					under the terms of this General Public License.  The "Program", below,
 | 
				
			||||||
 | 
					refers to any such program or work, and a "work based on the Program"
 | 
				
			||||||
 | 
					means either the Program or any derivative work under copyright law:
 | 
				
			||||||
 | 
					that is to say, a work containing the Program or a portion of it,
 | 
				
			||||||
 | 
					either verbatim or with modifications and/or translated into another
 | 
				
			||||||
 | 
					language.  (Hereinafter, translation is included without limitation in
 | 
				
			||||||
 | 
					the term "modification".)  Each licensee is addressed as "you".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Activities other than copying, distribution and modification are not
 | 
				
			||||||
 | 
					covered by this License; they are outside its scope.  The act of
 | 
				
			||||||
 | 
					running the Program is not restricted, and the output from the Program
 | 
				
			||||||
 | 
					is covered only if its contents constitute a work based on the
 | 
				
			||||||
 | 
					Program (independent of having been made by running the Program).
 | 
				
			||||||
 | 
					Whether that is true depends on what the Program does.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  1. You may copy and distribute verbatim copies of the Program's
 | 
				
			||||||
 | 
					source code as you receive it, in any medium, provided that you
 | 
				
			||||||
 | 
					conspicuously and appropriately publish on each copy an appropriate
 | 
				
			||||||
 | 
					copyright notice and disclaimer of warranty; keep intact all the
 | 
				
			||||||
 | 
					notices that refer to this License and to the absence of any warranty;
 | 
				
			||||||
 | 
					and give any other recipients of the Program a copy of this License
 | 
				
			||||||
 | 
					along with the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may charge a fee for the physical act of transferring a copy, and
 | 
				
			||||||
 | 
					you may at your option offer warranty protection in exchange for a fee.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  2. You may modify your copy or copies of the Program or any portion
 | 
				
			||||||
 | 
					of it, thus forming a work based on the Program, and copy and
 | 
				
			||||||
 | 
					distribute such modifications or work under the terms of Section 1
 | 
				
			||||||
 | 
					above, provided that you also meet all of these conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    a) You must cause the modified files to carry prominent notices
 | 
				
			||||||
 | 
					    stating that you changed the files and the date of any change.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    b) You must cause any work that you distribute or publish, that in
 | 
				
			||||||
 | 
					    whole or in part contains or is derived from the Program or any
 | 
				
			||||||
 | 
					    part thereof, to be licensed as a whole at no charge to all third
 | 
				
			||||||
 | 
					    parties under the terms of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c) If the modified program normally reads commands interactively
 | 
				
			||||||
 | 
					    when run, you must cause it, when started running for such
 | 
				
			||||||
 | 
					    interactive use in the most ordinary way, to print or display an
 | 
				
			||||||
 | 
					    announcement including an appropriate copyright notice and a
 | 
				
			||||||
 | 
					    notice that there is no warranty (or else, saying that you provide
 | 
				
			||||||
 | 
					    a warranty) and that users may redistribute the program under
 | 
				
			||||||
 | 
					    these conditions, and telling the user how to view a copy of this
 | 
				
			||||||
 | 
					    License.  (Exception: if the Program itself is interactive but
 | 
				
			||||||
 | 
					    does not normally print such an announcement, your work based on
 | 
				
			||||||
 | 
					    the Program is not required to print an announcement.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These requirements apply to the modified work as a whole.  If
 | 
				
			||||||
 | 
					identifiable sections of that work are not derived from the Program,
 | 
				
			||||||
 | 
					and can be reasonably considered independent and separate works in
 | 
				
			||||||
 | 
					themselves, then this License, and its terms, do not apply to those
 | 
				
			||||||
 | 
					sections when you distribute them as separate works.  But when you
 | 
				
			||||||
 | 
					distribute the same sections as part of a whole which is a work based
 | 
				
			||||||
 | 
					on the Program, the distribution of the whole must be on the terms of
 | 
				
			||||||
 | 
					this License, whose permissions for other licensees extend to the
 | 
				
			||||||
 | 
					entire whole, and thus to each and every part regardless of who wrote it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thus, it is not the intent of this section to claim rights or contest
 | 
				
			||||||
 | 
					your rights to work written entirely by you; rather, the intent is to
 | 
				
			||||||
 | 
					exercise the right to control the distribution of derivative or
 | 
				
			||||||
 | 
					collective works based on the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition, mere aggregation of another work not based on the Program
 | 
				
			||||||
 | 
					with the Program (or with a work based on the Program) on a volume of
 | 
				
			||||||
 | 
					a storage or distribution medium does not bring the other work under
 | 
				
			||||||
 | 
					the scope of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  3. You may copy and distribute the Program (or a work based on it,
 | 
				
			||||||
 | 
					under Section 2) in object code or executable form under the terms of
 | 
				
			||||||
 | 
					Sections 1 and 2 above provided that you also do one of the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    a) Accompany it with the complete corresponding machine-readable
 | 
				
			||||||
 | 
					    source code, which must be distributed under the terms of Sections
 | 
				
			||||||
 | 
					    1 and 2 above on a medium customarily used for software interchange; or,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    b) Accompany it with a written offer, valid for at least three
 | 
				
			||||||
 | 
					    years, to give any third party, for a charge no more than your
 | 
				
			||||||
 | 
					    cost of physically performing source distribution, a complete
 | 
				
			||||||
 | 
					    machine-readable copy of the corresponding source code, to be
 | 
				
			||||||
 | 
					    distributed under the terms of Sections 1 and 2 above on a medium
 | 
				
			||||||
 | 
					    customarily used for software interchange; or,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c) Accompany it with the information you received as to the offer
 | 
				
			||||||
 | 
					    to distribute corresponding source code.  (This alternative is
 | 
				
			||||||
 | 
					    allowed only for noncommercial distribution and only if you
 | 
				
			||||||
 | 
					    received the program in object code or executable form with such
 | 
				
			||||||
 | 
					    an offer, in accord with Subsection b above.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The source code for a work means the preferred form of the work for
 | 
				
			||||||
 | 
					making modifications to it.  For an executable work, complete source
 | 
				
			||||||
 | 
					code means all the source code for all modules it contains, plus any
 | 
				
			||||||
 | 
					associated interface definition files, plus the scripts used to
 | 
				
			||||||
 | 
					control compilation and installation of the executable.  However, as a
 | 
				
			||||||
 | 
					special exception, the source code distributed need not include
 | 
				
			||||||
 | 
					anything that is normally distributed (in either source or binary
 | 
				
			||||||
 | 
					form) with the major components (compiler, kernel, and so on) of the
 | 
				
			||||||
 | 
					operating system on which the executable runs, unless that component
 | 
				
			||||||
 | 
					itself accompanies the executable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If distribution of executable or object code is made by offering
 | 
				
			||||||
 | 
					access to copy from a designated place, then offering equivalent
 | 
				
			||||||
 | 
					access to copy the source code from the same place counts as
 | 
				
			||||||
 | 
					distribution of the source code, even though third parties are not
 | 
				
			||||||
 | 
					compelled to copy the source along with the object code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  4. You may not copy, modify, sublicense, or distribute the Program
 | 
				
			||||||
 | 
					except as expressly provided under this License.  Any attempt
 | 
				
			||||||
 | 
					otherwise to copy, modify, sublicense or distribute the Program is
 | 
				
			||||||
 | 
					void, and will automatically terminate your rights under this License.
 | 
				
			||||||
 | 
					However, parties who have received copies, or rights, from you under
 | 
				
			||||||
 | 
					this License will not have their licenses terminated so long as such
 | 
				
			||||||
 | 
					parties remain in full compliance.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  5. You are not required to accept this License, since you have not
 | 
				
			||||||
 | 
					signed it.  However, nothing else grants you permission to modify or
 | 
				
			||||||
 | 
					distribute the Program or its derivative works.  These actions are
 | 
				
			||||||
 | 
					prohibited by law if you do not accept this License.  Therefore, by
 | 
				
			||||||
 | 
					modifying or distributing the Program (or any work based on the
 | 
				
			||||||
 | 
					Program), you indicate your acceptance of this License to do so, and
 | 
				
			||||||
 | 
					all its terms and conditions for copying, distributing or modifying
 | 
				
			||||||
 | 
					the Program or works based on it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  6. Each time you redistribute the Program (or any work based on the
 | 
				
			||||||
 | 
					Program), the recipient automatically receives a license from the
 | 
				
			||||||
 | 
					original licensor to copy, distribute or modify the Program subject to
 | 
				
			||||||
 | 
					these terms and conditions.  You may not impose any further
 | 
				
			||||||
 | 
					restrictions on the recipients' exercise of the rights granted herein.
 | 
				
			||||||
 | 
					You are not responsible for enforcing compliance by third parties to
 | 
				
			||||||
 | 
					this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  7. If, as a consequence of a court judgment or allegation of patent
 | 
				
			||||||
 | 
					infringement or for any other reason (not limited to patent issues),
 | 
				
			||||||
 | 
					conditions are imposed on you (whether by court order, agreement or
 | 
				
			||||||
 | 
					otherwise) that contradict the conditions of this License, they do not
 | 
				
			||||||
 | 
					excuse you from the conditions of this License.  If you cannot
 | 
				
			||||||
 | 
					distribute so as to satisfy simultaneously your obligations under this
 | 
				
			||||||
 | 
					License and any other pertinent obligations, then as a consequence you
 | 
				
			||||||
 | 
					may not distribute the Program at all.  For example, if a patent
 | 
				
			||||||
 | 
					license would not permit royalty-free redistribution of the Program by
 | 
				
			||||||
 | 
					all those who receive copies directly or indirectly through you, then
 | 
				
			||||||
 | 
					the only way you could satisfy both it and this License would be to
 | 
				
			||||||
 | 
					refrain entirely from distribution of the Program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If any portion of this section is held invalid or unenforceable under
 | 
				
			||||||
 | 
					any particular circumstance, the balance of the section is intended to
 | 
				
			||||||
 | 
					apply and the section as a whole is intended to apply in other
 | 
				
			||||||
 | 
					circumstances.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is not the purpose of this section to induce you to infringe any
 | 
				
			||||||
 | 
					patents or other property right claims or to contest validity of any
 | 
				
			||||||
 | 
					such claims; this section has the sole purpose of protecting the
 | 
				
			||||||
 | 
					integrity of the free software distribution system, which is
 | 
				
			||||||
 | 
					implemented by public license practices.  Many people have made
 | 
				
			||||||
 | 
					generous contributions to the wide range of software distributed
 | 
				
			||||||
 | 
					through that system in reliance on consistent application of that
 | 
				
			||||||
 | 
					system; it is up to the author/donor to decide if he or she is willing
 | 
				
			||||||
 | 
					to distribute software through any other system and a licensee cannot
 | 
				
			||||||
 | 
					impose that choice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This section is intended to make thoroughly clear what is believed to
 | 
				
			||||||
 | 
					be a consequence of the rest of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  8. If the distribution and/or use of the Program is restricted in
 | 
				
			||||||
 | 
					certain countries either by patents or by copyrighted interfaces, the
 | 
				
			||||||
 | 
					original copyright holder who places the Program under this License
 | 
				
			||||||
 | 
					may add an explicit geographical distribution limitation excluding
 | 
				
			||||||
 | 
					those countries, so that distribution is permitted only in or among
 | 
				
			||||||
 | 
					countries not thus excluded.  In such case, this License incorporates
 | 
				
			||||||
 | 
					the limitation as if written in the body of this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  9. The Free Software Foundation may publish revised and/or new versions
 | 
				
			||||||
 | 
					of the General Public License from time to time.  Such new versions will
 | 
				
			||||||
 | 
					be similar in spirit to the present version, but may differ in detail to
 | 
				
			||||||
 | 
					address new problems or concerns.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each version is given a distinguishing version number.  If the Program
 | 
				
			||||||
 | 
					specifies a version number of this License which applies to it and "any
 | 
				
			||||||
 | 
					later version", you have the option of following the terms and conditions
 | 
				
			||||||
 | 
					either of that version or of any later version published by the Free
 | 
				
			||||||
 | 
					Software Foundation.  If the Program does not specify a version number of
 | 
				
			||||||
 | 
					this License, you may choose any version ever published by the Free Software
 | 
				
			||||||
 | 
					Foundation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  10. If you wish to incorporate parts of the Program into other free
 | 
				
			||||||
 | 
					programs whose distribution conditions are different, write to the author
 | 
				
			||||||
 | 
					to ask for permission.  For software which is copyrighted by the Free
 | 
				
			||||||
 | 
					Software Foundation, write to the Free Software Foundation; we sometimes
 | 
				
			||||||
 | 
					make exceptions for this.  Our decision will be guided by the two goals
 | 
				
			||||||
 | 
					of preserving the free status of all derivatives of our free software and
 | 
				
			||||||
 | 
					of promoting the sharing and reuse of software generally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								    NO WARRANTY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 | 
				
			||||||
 | 
					FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 | 
				
			||||||
 | 
					OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 | 
				
			||||||
 | 
					PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 | 
				
			||||||
 | 
					OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 | 
				
			||||||
 | 
					MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
 | 
				
			||||||
 | 
					TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 | 
				
			||||||
 | 
					PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 | 
				
			||||||
 | 
					REPAIR OR CORRECTION.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
				
			||||||
 | 
					WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 | 
				
			||||||
 | 
					REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 | 
				
			||||||
 | 
					INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 | 
				
			||||||
 | 
					OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 | 
				
			||||||
 | 
					TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 | 
				
			||||||
 | 
					YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 | 
				
			||||||
 | 
					PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 | 
				
			||||||
 | 
					POSSIBILITY OF SUCH DAMAGES.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							     END OF TERMS AND CONDITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    How to Apply These Terms to Your New Programs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  If you develop a new program, and you want it to be of the greatest
 | 
				
			||||||
 | 
					possible use to the public, the best way to achieve this is to make it
 | 
				
			||||||
 | 
					free software which everyone can redistribute and change under these terms.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  To do so, attach the following notices to the program.  It is safest
 | 
				
			||||||
 | 
					to attach them to the start of each source file to most effectively
 | 
				
			||||||
 | 
					convey the exclusion of warranty; and each file should have at least
 | 
				
			||||||
 | 
					the "copyright" line and a pointer to where the full notice is found.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <one line to give the program's name and a brief idea of what it does.>
 | 
				
			||||||
 | 
					    Copyright (C) <year>  <name of author>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Also add information on how to contact you by electronic and paper mail.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If the program is interactive, make it output a short notice like this
 | 
				
			||||||
 | 
					when it starts in an interactive mode:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Gnomovision version 69, Copyright (C) year name of author
 | 
				
			||||||
 | 
					    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 | 
				
			||||||
 | 
					    This is free software, and you are welcome to redistribute it
 | 
				
			||||||
 | 
					    under certain conditions; type `show c' for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The hypothetical commands `show w' and `show c' should show the appropriate
 | 
				
			||||||
 | 
					parts of the General Public License.  Of course, the commands you use may
 | 
				
			||||||
 | 
					be called something other than `show w' and `show c'; they could even be
 | 
				
			||||||
 | 
					mouse-clicks or menu items--whatever suits your program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should also get your employer (if you work as a programmer) or your
 | 
				
			||||||
 | 
					school, if any, to sign a "copyright disclaimer" for the program, if
 | 
				
			||||||
 | 
					necessary.  Here is a sample; alter the names:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 | 
				
			||||||
 | 
					  `Gnomovision' (which makes passes at compilers) written by James Hacker.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <signature of Ty Coon>, 1 April 1989
 | 
				
			||||||
 | 
					  Ty Coon, President of Vice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This General Public License does not permit incorporating your program into
 | 
				
			||||||
 | 
					proprietary programs.  If your program is a subroutine library, you may
 | 
				
			||||||
 | 
					consider it more useful to permit linking proprietary applications with the
 | 
				
			||||||
 | 
					library.  If this is what you want to do, use the GNU Library General
 | 
				
			||||||
 | 
					Public License instead of this License.
 | 
				
			||||||
							
								
								
									
										58
									
								
								ac3dec/Changelog
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ac3dec/Changelog
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					ac3dec-0.6.1 Mon Mar 27 20:27:06 EST 2000
 | 
				
			||||||
 | 
					-Fix another 2.0 problem (rematrix was wrong).
 | 
				
			||||||
 | 
					-Fix the never resync on a bad crc bug.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.6.0 Sat Mar 18 19:43:25 EST 2000
 | 
				
			||||||
 | 
					-New library interface 
 | 
				
			||||||
 | 
					-Fix bug wrt coupling channels that was causing sound quality problems. 
 | 
				
			||||||
 | 
					-Fix 2.0 mode problems (aka the I forgot to implement the phase flags bug). 
 | 
				
			||||||
 | 
					-All around speed improvements (almost twice as fast) 
 | 
				
			||||||
 | 
					-Improved robustness when fed bad data. The entire frame is checksummed before playback.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.6 Tue Nov 16 00:37:34 EST 1999
 | 
				
			||||||
 | 
					-Irix support 
 | 
				
			||||||
 | 
					-Alpha fixes 
 | 
				
			||||||
 | 
					-Minor performance enhancements to downmix and imdct
 | 
				
			||||||
 | 
					-OpenBSD fixes 
 | 
				
			||||||
 | 
					-extract_ac3 can now read from stdin
 | 
				
			||||||
 | 
					-Change output_linux to block on write instead of using the
 | 
				
			||||||
 | 
					 ring buffer. Let me know if this causes/fixes any problems
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.5 Wed Aug 25 15:36:44 EDT 1999
 | 
				
			||||||
 | 
					-Fixed a cut and paste bug (argh!) in parse.c which potentially 
 | 
				
			||||||
 | 
					 screwed up delta bit allocation info.
 | 
				
			||||||
 | 
					-Martin Mueller <mamueller@topmail.de> informed me that I was missing
 | 
				
			||||||
 | 
					 some corrections from the AC-3 errata document. It turns out that 
 | 
				
			||||||
 | 
					 I used an earlier version of the errata when I initially wrote ac3dec.
 | 
				
			||||||
 | 
					 Fortunately the errata fix the outstanding bugs that I was pulling
 | 
				
			||||||
 | 
					 my hair out on for a long time. Woohoo! Thanks Martin. Kudos to Dolby
 | 
				
			||||||
 | 
					 Labs for keeping their documentation up to date as well.
 | 
				
			||||||
 | 
					-stereo downmixing (downmix.c) is now in. Matrix encoded surround 
 | 
				
			||||||
 | 
					 (Dolby Prologic Surround) should work too.
 | 
				
			||||||
 | 
					-clipping due to high level signals has been fixed. We normalize a
 | 
				
			||||||
 | 
					 block of samples by its maximum absolute value if the max exceeds 
 | 
				
			||||||
 | 
					 the %100 digital level. This shouldn't be a problem, but for some 
 | 
				
			||||||
 | 
					 reason some channels have a dynamic range that exceeds [-1.0,1.0].
 | 
				
			||||||
 | 
					 I blame the encoder :)
 | 
				
			||||||
 | 
					-Multiple track support in extract_ac3. Simply just give it the track
 | 
				
			||||||
 | 
					 number you want [1,8] after the filename.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.4 Thu Jul 29 16:55:10 PDT 1999
 | 
				
			||||||
 | 
					-Fixed a stupid bug with the coupling channel that was causing
 | 
				
			||||||
 | 
					 high frequencies to be attenuated.
 | 
				
			||||||
 | 
					-Re-wrote the extract_ac3 tool.
 | 
				
			||||||
 | 
					-Added to a tool to verify the checksums on a given AC3 stream. 
 | 
				
			||||||
 | 
					 (tools/verify_ac3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.3  Mon Jul 12 10:45:56 PDT 1999
 | 
				
			||||||
 | 
					-Fixed problems related to streams with coupling channel enabled.
 | 
				
			||||||
 | 
					-Minor performance enhancements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.2  Sun Jul  4 12:00:25 PDT 1999
 | 
				
			||||||
 | 
					-output_linux.c patch provided by Michael Holzt <kju@flummi.de>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.1  Wed Jun 30 17:48:52 PDT 1999
 | 
				
			||||||
 | 
					-Compiles and dies gracefully under Linux now.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec-0.5.0  Wed Jun 23 11:06:06 EDT 1999
 | 
				
			||||||
 | 
					-First public release of ac3dec.
 | 
				
			||||||
							
								
								
									
										22
									
								
								ac3dec/Makefile.am
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ac3dec/Makefile.am
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					# # Process this file with automake to produce Makefile.in.
 | 
				
			||||||
 | 
					AUTOMAKE_OPTIONS = 1.3 foreign
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bin_PROGRAMS = ac3dec 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3dec_LDADD= -L./libac3 -lac3 -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noinst_HEADERS = output.h
 | 
				
			||||||
 | 
					ac3dec_SOURCES = ac3dec.c output.c ac3spdif.c
 | 
				
			||||||
 | 
					ac3dec_DEPENDENCIES = libac3/libac3.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXTRA_DIST = gitcompile README Changelog TODO plot_spectrum.m autogen.sh \
 | 
				
			||||||
 | 
					             depcomp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SUBDIRS = libac3 tools test .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					alsa-dist: distdir
 | 
				
			||||||
 | 
						@rm -rf ../distdir/ac3dec
 | 
				
			||||||
 | 
						@mkdir -p ../distdir/ac3dec
 | 
				
			||||||
 | 
						@cp -RLpv $(distdir)/* ../distdir/ac3dec
 | 
				
			||||||
 | 
						@rm -rf $(distdir)
 | 
				
			||||||
							
								
								
									
										52
									
								
								ac3dec/README
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								ac3dec/README
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					ac3dec - a free AC-3 stream decoder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Written by Aaron Holtzman (aholtzma@engr.uvic.ca)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Contributors:
 | 
				
			||||||
 | 
					  Michael Holzt <kju@flummi.de> - OSS output.c and misc errata
 | 
				
			||||||
 | 
						Jim Miller <jmiller@heli.engr.sgi.com> - IRIX output.c
 | 
				
			||||||
 | 
						Angelos Keromytis <angelos@dsl.cis.upenn.edu> - OpenBSD fixes
 | 
				
			||||||
 | 
						Don Mahurin <dmahurin@dma.org> - stdin support for extract_ac3
 | 
				
			||||||
 | 
						Takefumi SAYO <stake@niagara.shiojiri.ne.jp> - FreeBSD tweak
 | 
				
			||||||
 | 
						Charles M. Hannum <root@ihack.net> - fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					See the file COPYING for license details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The currently supported platforms are Linux, Solaris, IRIX, OpenBSD, and
 | 
				
			||||||
 | 
					FreeBSD. If you want support for other platforms, take a look at 
 | 
				
			||||||
 | 
					output_*.c for an idea of what you need to do.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This software is completely useless to 99.99 percent of users
 | 
				
			||||||
 | 
					out there. It is mostly of use to those interested in audio
 | 
				
			||||||
 | 
					coding research and evaluating codecs. It could theoretically
 | 
				
			||||||
 | 
					be used as a portion of a DVD playback system for unix systems. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HOW TO COMPILE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Building ac3dec should be easy. Here's how:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					./configure && make all
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USAGE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To find AC-3 streams on the internet, use www.google.com and 
 | 
				
			||||||
 | 
					search for "vob trailer". A vob is a "Video Object" which is
 | 
				
			||||||
 | 
					just an MPEG-2 stream. The site www.hollywood.com has a 
 | 
				
			||||||
 | 
					few good MPEG-2s with AC-3 audio. The program tools/extract_ac3 
 | 
				
			||||||
 | 
					will take an MPEG-2 stream and spit out AC-3 audio to stdout if
 | 
				
			||||||
 | 
					it exists. You can easily pipe this data to the ac3 player like
 | 
				
			||||||
 | 
					this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ./tools/extract_ac3 foo.vob | ./ac3dec/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can also get AC-3 streams on a DVD. Check out 
 | 
				
			||||||
 | 
					http://www.linuxvideo.org for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEBUG OUTPUT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can get a whole pile of debug info by setting the environment
 | 
				
			||||||
 | 
					variable AC3_DEBUG=1. Be sure to pipe stderr to a file or you probably
 | 
				
			||||||
 | 
					won't get realtime playback. You can pipe stderr to a file like so:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ./ac3dec foo.ac3 2> debug.out
 | 
				
			||||||
							
								
								
									
										22
									
								
								ac3dec/TODO
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ac3dec/TODO
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					- Detect hrtime on solaris and enable it via config.h
 | 
				
			||||||
 | 
					- Add multilevel debug output
 | 
				
			||||||
 | 
					- change the divides/moduluos in coeff_get_mantissa to table
 | 
				
			||||||
 | 
					  lookups. Need to look at stats first though.
 | 
				
			||||||
 | 
					- rewrite imdct to use split 2/4 radix fft
 | 
				
			||||||
 | 
					- investigate strangeness in 256 point imdct (weird transients?)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DONE
 | 
				
			||||||
 | 
					- fix the bitstream interface to allow on aligned buffers - Feb 2000 -AH
 | 
				
			||||||
 | 
					- change dither.c, crc.c to use a lookup table - March 2000 -AH
 | 
				
			||||||
 | 
					- the output signal from the IMDCT sometimes is outside the rand
 | 
				
			||||||
 | 
					  of [-1.0,1.0]. This is why there is the normalization pass in
 | 
				
			||||||
 | 
						output.c. Need to investigate and hopefully we can move the
 | 
				
			||||||
 | 
						normalization. - Feb 2000 -AH
 | 
				
			||||||
 | 
					- Mute frame on error. Feb 2000 -AH
 | 
				
			||||||
 | 
					- Revisit convert_to_float and use int->float with scaling - Feb 2000 -AH
 | 
				
			||||||
 | 
					- Use proper frame sizes in auxdata parsing - July 1999 - AH
 | 
				
			||||||
 | 
					- fix clipping in output (normalize to max digital output) - Aug 99 -AH
 | 
				
			||||||
 | 
					- Fix coupling channel support - July 1999 - AH
 | 
				
			||||||
 | 
					- Add delta bit allocation support - July 1999 - AH
 | 
				
			||||||
 | 
					- Add downmixing support - Sept 1999 - AH, Yeqing Deng
 | 
				
			||||||
							
								
								
									
										246
									
								
								ac3dec/ac3dec.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										246
									
								
								ac3dec/ac3dec.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,246 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *   ac3dec.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <getopt.h>
 | 
				
			||||||
 | 
					#include <sys/errno.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "libac3/ac3.h"
 | 
				
			||||||
 | 
					#include "output.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void init_spdif(void);
 | 
				
			||||||
 | 
					int output_spdif_zero(int frames);
 | 
				
			||||||
 | 
					int output_spdif_leadin(void);
 | 
				
			||||||
 | 
					int output_spdif(uint_8 *data_start, uint_8 *data_end, int quiet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int end_flag = 0;
 | 
				
			||||||
 | 
					static int quiet = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void help(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						printf("Usage: ac3dec <options> [file] [[file]] ...\n");
 | 
				
			||||||
 | 
						printf("\nAvailable options:\n");
 | 
				
			||||||
 | 
						printf("  -h,--help         this help\n");
 | 
				
			||||||
 | 
						printf("  -v,--version      print version of this program\n");
 | 
				
			||||||
 | 
						printf("  -D,--device=NAME  select PCM by NAME\n");
 | 
				
			||||||
 | 
						printf("  -c,--card=ID      select card for bellow modes\n");
 | 
				
			||||||
 | 
						printf("  -4,--4ch	    four channels mode\n");
 | 
				
			||||||
 | 
						printf("  -6,--6ch	    six channels mode\n");
 | 
				
			||||||
 | 
						printf("  -C,--iec958c      raw IEC958 (S/PDIF) consumer mode\n");
 | 
				
			||||||
 | 
						printf("  -P,--iec958p      raw IEC958 (S/PDIF) professional mode\n");
 | 
				
			||||||
 | 
						printf("  -R,--iec958r      raw IEC958 (S/PDIF) PCM\n");
 | 
				
			||||||
 | 
						printf("  -H,--hdmi         output to HDMI device\n");
 | 
				
			||||||
 | 
						printf("  -Z,--zero=#       add # zero-AC3-frames before stream\n");
 | 
				
			||||||
 | 
						printf("  -q,--quiet        quiet mode\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CHUNK_SIZE 2047
 | 
				
			||||||
 | 
					uint_8 buf[CHUNK_SIZE];
 | 
				
			||||||
 | 
					FILE *in_file;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					ssize_t fill_buffer(uint_8 **start,uint_8 **end)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 bytes_read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*start = buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bytes_read = fread(*start,1,CHUNK_SIZE,in_file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (feof(in_file) || ferror(in_file) || bytes_read < CHUNK_SIZE) {
 | 
				
			||||||
 | 
							end_flag = 1;
 | 
				
			||||||
 | 
							return EOF;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*end = *start + bytes_read;
 | 
				
			||||||
 | 
						return bytes_read;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ac3dec_signal_handler(int signal)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!quiet)
 | 
				
			||||||
 | 
							fprintf(stderr, "Aborted...\n");
 | 
				
			||||||
 | 
						// it's important to close the PCM handle(s), because
 | 
				
			||||||
 | 
						// some driver settings have to be recovered
 | 
				
			||||||
 | 
						output_close();
 | 
				
			||||||
 | 
						fclose(in_file);
 | 
				
			||||||
 | 
						exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc,char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct option long_option[] =
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							{"help", 0, NULL, 'h'},
 | 
				
			||||||
 | 
							{"version", 0, NULL, 'v'},
 | 
				
			||||||
 | 
							{"device", 1, NULL, 'D'},
 | 
				
			||||||
 | 
							{"4ch", 0, NULL, '4'},
 | 
				
			||||||
 | 
							{"6ch", 0, NULL, '6'},
 | 
				
			||||||
 | 
							{"card", 1, NULL, 'c'},
 | 
				
			||||||
 | 
							{"iec958c", 0, NULL, 'C'},
 | 
				
			||||||
 | 
							{"spdif", 0, NULL, 'C'},
 | 
				
			||||||
 | 
							{"iec958p", 0, NULL, 'P'},
 | 
				
			||||||
 | 
							{"iec958r", 0, NULL, 'R'},
 | 
				
			||||||
 | 
							{"hdmi", 0, NULL, 'H'},
 | 
				
			||||||
 | 
							{"zero", 1, NULL, 'Z'},
 | 
				
			||||||
 | 
							{"quiet", 0, NULL, 'q'},
 | 
				
			||||||
 | 
							{NULL, 0, NULL, 0},
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						ac3_config_t ac3_config;
 | 
				
			||||||
 | 
						output_t out_config;
 | 
				
			||||||
 | 
						int morehelp, loop = 0;
 | 
				
			||||||
 | 
						int zero = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bzero(&ac3_config, sizeof(ac3_config));
 | 
				
			||||||
 | 
						ac3_config.fill_buffer_callback = fill_buffer;
 | 
				
			||||||
 | 
						ac3_config.num_output_ch = 2;
 | 
				
			||||||
 | 
						ac3_config.flags = 0;
 | 
				
			||||||
 | 
						bzero(&out_config, sizeof(out_config));
 | 
				
			||||||
 | 
						out_config.pcm_name = NULL;
 | 
				
			||||||
 | 
						out_config.card = NULL;
 | 
				
			||||||
 | 
						out_config.bits = 16;
 | 
				
			||||||
 | 
						out_config.rate = 48000;
 | 
				
			||||||
 | 
						out_config.channels = 2;
 | 
				
			||||||
 | 
						out_config.spdif = SPDIF_NONE;
 | 
				
			||||||
 | 
						out_config.hdmi = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						morehelp = 0;
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							int c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ((c = getopt_long(argc, argv, "hvc:D:46HCPRZ:q", long_option, NULL)) < 0)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							switch (c) {
 | 
				
			||||||
 | 
							case 'h':
 | 
				
			||||||
 | 
								morehelp++;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'v':
 | 
				
			||||||
 | 
								printf("ac3dec version " VERSION "\n");
 | 
				
			||||||
 | 
								return 1;
 | 
				
			||||||
 | 
							case 'c':
 | 
				
			||||||
 | 
								out_config.card = strdup(optarg);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'D':
 | 
				
			||||||
 | 
								out_config.pcm_name = optarg;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case '4':
 | 
				
			||||||
 | 
								if (out_config.spdif == SPDIF_NONE)
 | 
				
			||||||
 | 
									ac3_config.num_output_ch = 4;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case '6':
 | 
				
			||||||
 | 
								if (out_config.spdif == SPDIF_NONE)
 | 
				
			||||||
 | 
									ac3_config.num_output_ch = 6;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'C':
 | 
				
			||||||
 | 
								ac3_config.num_output_ch = 2;
 | 
				
			||||||
 | 
								out_config.spdif = SPDIF_CON;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'P':
 | 
				
			||||||
 | 
								ac3_config.num_output_ch = 2;
 | 
				
			||||||
 | 
								out_config.spdif = SPDIF_PRO;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'R':
 | 
				
			||||||
 | 
								ac3_config.num_output_ch = 2;
 | 
				
			||||||
 | 
								out_config.spdif = SPDIF_PCM;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'H':
 | 
				
			||||||
 | 
								out_config.hdmi = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'Z':
 | 
				
			||||||
 | 
								zero = atoi(optarg);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'q':
 | 
				
			||||||
 | 
								ac3_config.flags |= AC3_QUIET;
 | 
				
			||||||
 | 
								out_config.quiet = 1;
 | 
				
			||||||
 | 
								quiet = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								fprintf(stderr, "\07Invalid switch or option needs an argument.\n");
 | 
				
			||||||
 | 
								morehelp++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						out_config.channels = ac3_config.num_output_ch;
 | 
				
			||||||
 | 
						if (morehelp) {
 | 
				
			||||||
 | 
							help();
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							if (argc - optind <= 0) {
 | 
				
			||||||
 | 
								if (loop || end_flag)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								in_file = stdin;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								in_file = fopen(argv[optind],"r");	
 | 
				
			||||||
 | 
								if(!in_file) {
 | 
				
			||||||
 | 
									fprintf(stderr,"%s - Couldn't open file %s\n",strerror(errno),argv[optind]);
 | 
				
			||||||
 | 
									exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								optind++;
 | 
				
			||||||
 | 
								loop++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ((out_config.spdif == SPDIF_NONE) || (out_config.spdif == SPDIF_PCM)) {
 | 
				
			||||||
 | 
								ac3_frame_t *ac3_frame;
 | 
				
			||||||
 | 
								ac3_init(&ac3_config);
 | 
				
			||||||
 | 
								ac3_frame = ac3_decode_frame();
 | 
				
			||||||
 | 
								out_config.rate = ac3_frame->sampling_rate;
 | 
				
			||||||
 | 
								if (output_open(&out_config) < 0) {
 | 
				
			||||||
 | 
									fprintf(stderr, "Output open failed\n");
 | 
				
			||||||
 | 
									exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								signal(SIGINT, ac3dec_signal_handler);
 | 
				
			||||||
 | 
								signal(SIGTERM, ac3dec_signal_handler);
 | 
				
			||||||
 | 
								signal(SIGABRT, ac3dec_signal_handler);
 | 
				
			||||||
 | 
								do {
 | 
				
			||||||
 | 
									//Send the samples to the output device 
 | 
				
			||||||
 | 
									output_play(ac3_frame->audio_data, 256 * 6);
 | 
				
			||||||
 | 
								} while((ac3_frame = ac3_decode_frame()));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								uint_8 *start, *end;
 | 
				
			||||||
 | 
								init_spdif();
 | 
				
			||||||
 | 
								if (output_open(&out_config) < 0) {
 | 
				
			||||||
 | 
									fprintf(stderr, "Output open failed\n");
 | 
				
			||||||
 | 
									exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								signal(SIGINT, ac3dec_signal_handler);
 | 
				
			||||||
 | 
								signal(SIGTERM, ac3dec_signal_handler);
 | 
				
			||||||
 | 
								signal(SIGABRT, ac3dec_signal_handler);
 | 
				
			||||||
 | 
								if (zero > 0)
 | 
				
			||||||
 | 
									output_spdif_zero(zero);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									output_spdif_leadin();
 | 
				
			||||||
 | 
								while (fill_buffer(&start, &end) > 0)
 | 
				
			||||||
 | 
									if (output_spdif(start, end, quiet) < 0)
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							output_close();
 | 
				
			||||||
 | 
							fclose(in_file);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return EXIT_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										166
									
								
								ac3dec/ac3spdif.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								ac3dec/ac3spdif.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,166 @@
 | 
				
			||||||
 | 
					/***************************************************************************/
 | 
				
			||||||
 | 
					/*  This code has been fully inspired from various place                   */
 | 
				
			||||||
 | 
					/*  I will give their name later. May they be bless .... It works   	   */
 | 
				
			||||||
 | 
					/*                                                                         */
 | 
				
			||||||
 | 
					/*	For the moment test it.                                            */   
 | 
				
			||||||
 | 
					/*									   */
 | 
				
			||||||
 | 
					/* 27-08-00 -- Ze'ev Maor -- fixed recovery from flase syncword detection  */
 | 
				
			||||||
 | 
					/* 								           */
 | 
				
			||||||
 | 
					/* 24-08-00 -- Ze'ev Maor -- Modified for integrtion with DXR3-OMS-plugin  */  
 | 
				
			||||||
 | 
					/***************************************************************************/
 | 
				
			||||||
 | 
														   
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <libac3/ac3.h>
 | 
				
			||||||
 | 
					#include <libac3/ac3_internal.h>
 | 
				
			||||||
 | 
					#include <libac3/parse.h>
 | 
				
			||||||
 | 
					#include <libac3/crc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "output.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void swab(const void*, void*, size_t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BLOCK_SIZE 6144
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static unsigned char buf[BLOCK_SIZE];
 | 
				
			||||||
 | 
					static uint32_t sbuffer_size;
 | 
				
			||||||
 | 
					static syncinfo_t syncinfo;
 | 
				
			||||||
 | 
					static char *sbuffer;
 | 
				
			||||||
 | 
					static int done_banner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t
 | 
				
			||||||
 | 
					buffer_syncframe(syncinfo_t *syncinfo, uint8_t **start, uint8_t *end)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8_t *cur = *start;
 | 
				
			||||||
 | 
					  uint16_t syncword = syncinfo->syncword;
 | 
				
			||||||
 | 
					  uint32_t ret = 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  // Find an ac3 sync frame.
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  while(syncword != 0x0b77)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if(cur >= end)
 | 
				
			||||||
 | 
						goto done;
 | 
				
			||||||
 | 
					      syncword = (syncword << 8) + *cur++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  //need the next 3 bytes to decide how big the frame is
 | 
				
			||||||
 | 
					  while(sbuffer_size < 3)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if(cur >= end)
 | 
				
			||||||
 | 
						goto done;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					      sbuffer[sbuffer_size++] = *cur++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					                                                                                    
 | 
				
			||||||
 | 
					  parse_syncinfo_data(syncinfo,sbuffer);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  while(sbuffer_size < (uint32_t)syncinfo->frame_size * 2 - 2)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if(cur >= end)
 | 
				
			||||||
 | 
						goto done;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					      sbuffer[sbuffer_size++] = *cur++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  crc_init();
 | 
				
			||||||
 | 
					  crc_process_frame(sbuffer,syncinfo->frame_size * 2 - 2);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					  if(!crc_validate())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      //error_flag = 1;
 | 
				
			||||||
 | 
					      fprintf(stderr,"** CRC failed - skipping frame **\n");
 | 
				
			||||||
 | 
					      syncword = 0xffff;
 | 
				
			||||||
 | 
					      sbuffer_size = 0;
 | 
				
			||||||
 | 
					      bzero(buf,BLOCK_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      goto done;
 | 
				
			||||||
 | 
					    }                                                                           
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					  //if we got to this point, we found a valid ac3 frame to decode
 | 
				
			||||||
 | 
					  //
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  //reset the syncword for next time
 | 
				
			||||||
 | 
					  syncword = 0xffff;
 | 
				
			||||||
 | 
					  sbuffer_size = 0;
 | 
				
			||||||
 | 
					  ret = 1;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 done:
 | 
				
			||||||
 | 
					  syncinfo->syncword = syncword;
 | 
				
			||||||
 | 
					  *start = cur;
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}                                                                                  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					init_spdif(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  sbuffer_size = 0;
 | 
				
			||||||
 | 
					  sbuffer = &buf[10];
 | 
				
			||||||
 | 
					  done_banner = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					output_spdif_zero(int frames)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  buf[0] = 0x72; buf[1] = 0xf8;  // spdif syncword
 | 
				
			||||||
 | 
					  buf[2] = 0x1f; buf[3] = 0x4e;  // ..............
 | 
				
			||||||
 | 
					  buf[4] = 0x00;		 // null frame (no data) 
 | 
				
			||||||
 | 
					  buf[5] = 7 << 5;		 // stream = 7
 | 
				
			||||||
 | 
					  buf[6] = 0x00; buf[7] = 0x00;  // frame size
 | 
				
			||||||
 | 
					  memset(&buf[8], 0, BLOCK_SIZE - 8);
 | 
				
			||||||
 | 
					  while (frames-- > 0) {
 | 
				
			||||||
 | 
					    res = output_play((short *)buf, BLOCK_SIZE / 2 / 2);	/* 2 channels, 16-bit samples */
 | 
				
			||||||
 | 
					    if (res < 0)
 | 
				
			||||||
 | 
					      return res;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					output_spdif_leadin(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  memset(buf, 0, 8);
 | 
				
			||||||
 | 
					  return output_play((short *)buf, 8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					output_spdif(uint8_t *data_start, uint8_t *data_end, int quiet)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int ret = 0, res;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  while(buffer_syncframe(&syncinfo, &data_start, data_end))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      buf[0] = 0x72; buf[1] = 0xf8;	// spdif syncword
 | 
				
			||||||
 | 
					      buf[2] = 0x1f; buf[3] = 0x4e;	// ..............
 | 
				
			||||||
 | 
					      buf[4] = 0x01;			// AC3 data
 | 
				
			||||||
 | 
					      buf[5] = buf[13] & 7;		// bsmod, stream = 0
 | 
				
			||||||
 | 
					      buf[6] = (syncinfo.frame_size * 16) & 0xff;
 | 
				
			||||||
 | 
					      buf[7] = ((syncinfo.frame_size * 16) >> 8) & 0xff;
 | 
				
			||||||
 | 
					      buf[8] = 0x77; buf[9] = 0x0b;	// AC3 syncwork
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      if (!done_banner && !quiet) {
 | 
				
			||||||
 | 
					        fprintf(stdout,"AC3 Stream ");
 | 
				
			||||||
 | 
						fprintf(stdout,"%2.1f KHz",syncinfo.sampling_rate * 1e-3);
 | 
				
			||||||
 | 
					        fprintf(stdout,"%4d kbps",syncinfo.bit_rate);
 | 
				
			||||||
 | 
					        fprintf(stdout,"\n");
 | 
				
			||||||
 | 
					        done_banner = 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					#ifndef _a_b_c_d_e_f /* WORDS_BIGENDIAN */
 | 
				
			||||||
 | 
					      // extract_ac3 seems to write swabbed data
 | 
				
			||||||
 | 
					      swab(&buf[10], &buf[10], syncinfo.frame_size * 2 - 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      res = output_play((short *)buf, BLOCK_SIZE / 2 / 2);	/* 2 channels, 16-bit samples */
 | 
				
			||||||
 | 
					      ret = ret < 0 ? ret : res;
 | 
				
			||||||
 | 
					      bzero(buf,BLOCK_SIZE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										55
									
								
								ac3dec/autogen.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								ac3dec/autogen.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					# Run this to generate all the initial makefiles, etc.
 | 
				
			||||||
 | 
					# This was lifted from the Gimp, and adapted slightly by
 | 
				
			||||||
 | 
					# Raph Levien .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DIE=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PROG=ac3dec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(autoconf --version) < /dev/null > /dev/null 2>&1 || {
 | 
				
			||||||
 | 
					        echo
 | 
				
			||||||
 | 
					        echo "You must have autoconf installed to compile $PROG."
 | 
				
			||||||
 | 
					        echo "Download the appropriate package for your distribution,"
 | 
				
			||||||
 | 
					        echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
 | 
				
			||||||
 | 
					        DIE=1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Do we really need libtool?
 | 
				
			||||||
 | 
					#(libtool --version) < /dev/null > /dev/null 2>&1 || {
 | 
				
			||||||
 | 
					#        echo
 | 
				
			||||||
 | 
					#        echo "You must have libtool installed to compile $PROG."
 | 
				
			||||||
 | 
					#        echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2.tar.gz"
 | 
				
			||||||
 | 
					#        echo "(or a newer version if it is available)"
 | 
				
			||||||
 | 
					#        DIE=1
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(automake --version) < /dev/null > /dev/null 2>&1 || {
 | 
				
			||||||
 | 
					        echo
 | 
				
			||||||
 | 
					        echo "You must have automake installed to compile $PROG."
 | 
				
			||||||
 | 
					        echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
 | 
				
			||||||
 | 
					        echo "(or a newer version if it is available)"
 | 
				
			||||||
 | 
					        DIE=1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test "$DIE" -eq 1; then
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test -z "$*"; then
 | 
				
			||||||
 | 
					        echo "I am going to run ./configure with no arguments - if you wish "
 | 
				
			||||||
 | 
					        echo "to pass any to it, please specify them on the $0 command line."
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for dir in .
 | 
				
			||||||
 | 
					do 
 | 
				
			||||||
 | 
					  echo processing $dir
 | 
				
			||||||
 | 
					  (cd $dir; \
 | 
				
			||||||
 | 
					  aclocalinclude="$ACLOCAL_FLAGS"; \
 | 
				
			||||||
 | 
					  aclocal $aclocalinclude; \
 | 
				
			||||||
 | 
					  autoheader; automake --foreign -a; autoconf)
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					./configure "$@"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo 
 | 
				
			||||||
 | 
					echo "Now type 'make' to compile $PROG."
 | 
				
			||||||
							
								
								
									
										30
									
								
								ac3dec/configure.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								ac3dec/configure.in
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					dnl Autoconf configuration script ac3dec
 | 
				
			||||||
 | 
					dnl 
 | 
				
			||||||
 | 
					dnl Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					dnl
 | 
				
			||||||
 | 
					AC_INIT(ac3dec.c)
 | 
				
			||||||
 | 
					AM_CONFIG_HEADER(config.h)
 | 
				
			||||||
 | 
					AC_CANONICAL_HOST
 | 
				
			||||||
 | 
					AC_PREREQ(2.13)
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE(ac3dec, 0.6.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_MAINTAINER_MODE
 | 
				
			||||||
 | 
					AC_PROG_CC
 | 
				
			||||||
 | 
					AC_PROG_GCC_TRADITIONAL
 | 
				
			||||||
 | 
					AC_PROG_RANLIB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_C_BIGENDIAN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_PATH_ALSA(1.0.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dnl Set the appropriate architecture define
 | 
				
			||||||
 | 
					dnl case "$host" in
 | 
				
			||||||
 | 
					dnl i?86-*) AC_DEFINE(__i386__, 1, [Using i386 architecture]);;
 | 
				
			||||||
 | 
					dnl alpha*-*) AC_DEFINE(__alpha__, 1, [Using Alpha architecture]);;
 | 
				
			||||||
 | 
					dnl sparc-*) AC_DEFINE(__sparc__, 1, [Using SPARC architecture]);;
 | 
				
			||||||
 | 
					dnl ppc-*|powerpc-*) AC_DEFINE(__ppc__, 1, [Using PowerPC architecture]);;
 | 
				
			||||||
 | 
					dnl ia64-*) AC_DEFINE(__ia64__, 1, [Using IA-64 architecture]);;
 | 
				
			||||||
 | 
					dnl *) echo "$host is not currently supported by ac3dec"; exit 1;;
 | 
				
			||||||
 | 
					dnl esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_OUTPUT(libac3/Makefile tools/Makefile test/Makefile Makefile ) 
 | 
				
			||||||
							
								
								
									
										9
									
								
								ac3dec/cvscompile
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										9
									
								
								ac3dec/cvscompile
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aclocal $ACLOCAL_FLAGS
 | 
				
			||||||
 | 
					autoheader
 | 
				
			||||||
 | 
					automake --add-missing --copy --foreign
 | 
				
			||||||
 | 
					touch depcomp
 | 
				
			||||||
 | 
					autoconf
 | 
				
			||||||
 | 
					./configure $*
 | 
				
			||||||
 | 
					make
 | 
				
			||||||
							
								
								
									
										11
									
								
								ac3dec/gitcompile
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								ac3dec/gitcompile
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aclocal $ACLOCAL_FLAGS || exit 1
 | 
				
			||||||
 | 
					autoheader || exit 1
 | 
				
			||||||
 | 
					automake --add-missing --copy --foreign || exit 1
 | 
				
			||||||
 | 
					touch depcomp || exit 1
 | 
				
			||||||
 | 
					autoconf || exit 1
 | 
				
			||||||
 | 
					./configure $* || exit 1
 | 
				
			||||||
 | 
					if [ -z "$GITCOMPILE_NO_MAKE" ]; then
 | 
				
			||||||
 | 
					  make || exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
							
								
								
									
										15
									
								
								ac3dec/libac3/Makefile.am
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								ac3dec/libac3/Makefile.am
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					# # Process this file with automake to produce Makefile.in.
 | 
				
			||||||
 | 
					AUTOMAKE_OPTIONS = 1.3 foreign
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CFLAGS = -Wall -O1 -g
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noinst_LIBRARIES = libac3.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libac3_a_SOURCES = bitstream.c decode.c imdct.c coeff.c exponent.c stats.c\
 | 
				
			||||||
 | 
						bit_allocate.c  parse.c crc.c debug.c rematrix.c downmix.c dither.c \
 | 
				
			||||||
 | 
						sanity_check.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noinst_HEADERS = ac3_internal.h bitstream.h decode.h imdct.h ac3.h stats.h coeff.h\
 | 
				
			||||||
 | 
						exponent.h bit_allocate.h parse.h crc.h debug.h rematrix.h downmix.h dither.h \
 | 
				
			||||||
 | 
						sanity_check.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										63
									
								
								ac3dec/libac3/ac3.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								ac3dec/libac3/ac3.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    ac3.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef AARONS_TYPES
 | 
				
			||||||
 | 
					#define AARONS_TYPES
 | 
				
			||||||
 | 
					typedef unsigned long long uint_64;
 | 
				
			||||||
 | 
					typedef unsigned int   uint_32;
 | 
				
			||||||
 | 
					typedef unsigned short uint_16;
 | 
				
			||||||
 | 
					typedef unsigned char  uint_8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef signed long long sint_64;
 | 
				
			||||||
 | 
					typedef signed int     sint_32;
 | 
				
			||||||
 | 
					typedef signed short   sint_16;
 | 
				
			||||||
 | 
					typedef signed char    sint_8;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define AC3_DOLBY_SURR_ENABLE 0x1
 | 
				
			||||||
 | 
					#define AC3_3DNOW_ENABLE      0x2
 | 
				
			||||||
 | 
					#define AC3_MMX_ENABLE        0x4
 | 
				
			||||||
 | 
					#define AC3_ALTIVEC_ENABLE    0x8
 | 
				
			||||||
 | 
					#define AC3_QUIET	      0x10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ac3_config_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//Bit flags that enable various things
 | 
				
			||||||
 | 
						uint_32 flags;
 | 
				
			||||||
 | 
						//Callback that points the decoder to new stream data
 | 
				
			||||||
 | 
						ssize_t (*fill_buffer_callback)(uint_8 **, uint_8 **);
 | 
				
			||||||
 | 
						//Number of discrete channels in final output (for downmixing)
 | 
				
			||||||
 | 
						uint_16 num_output_ch;
 | 
				
			||||||
 | 
						//Which channel of a dual mono stream to select
 | 
				
			||||||
 | 
						uint_16 dual_mono_ch_sel;
 | 
				
			||||||
 | 
					} ac3_config_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ac3_frame_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 sampling_rate;
 | 
				
			||||||
 | 
						sint_16 *audio_data;
 | 
				
			||||||
 | 
					} ac3_frame_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ac3_init(ac3_config_t *config);
 | 
				
			||||||
 | 
					ac3_frame_t* ac3_decode_frame(void);
 | 
				
			||||||
							
								
								
									
										344
									
								
								ac3dec/libac3/ac3_internal.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								ac3dec/libac3/ac3_internal.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,344 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    ac3_internal.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __GNUC__
 | 
				
			||||||
 | 
					#define inline 
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Exponent strategy constants */
 | 
				
			||||||
 | 
					#define EXP_REUSE (0)
 | 
				
			||||||
 | 
					#define EXP_D15   (1)
 | 
				
			||||||
 | 
					#define EXP_D25   (2)
 | 
				
			||||||
 | 
					#define EXP_D45   (3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Delta bit allocation constants */
 | 
				
			||||||
 | 
					#define DELTA_BIT_REUSE (0)
 | 
				
			||||||
 | 
					#define DELTA_BIT_NEW (1)
 | 
				
			||||||
 | 
					#define DELTA_BIT_NONE (2)
 | 
				
			||||||
 | 
					#define DELTA_BIT_RESERVED (3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* samples work structure */
 | 
				
			||||||
 | 
					typedef float stream_samples_t[6][256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* global config structure */
 | 
				
			||||||
 | 
					extern ac3_config_t ac3_config;
 | 
				
			||||||
 | 
					/* global error flag */
 | 
				
			||||||
 | 
					extern uint_32 error_flag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Everything you wanted to know about band structure */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * The entire frequency domain is represented by 256 real
 | 
				
			||||||
 | 
					 * floating point fourier coefficients. Only the lower 253
 | 
				
			||||||
 | 
					 * coefficients are actually utilized however. We use arrays
 | 
				
			||||||
 | 
					 * of 256 to be efficient in some cases.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The 5 full bandwidth channels (fbw) can have their higher
 | 
				
			||||||
 | 
					 * frequencies coupled together. These coupled channels then
 | 
				
			||||||
 | 
					 * share their high frequency components.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This coupling band is broken up into 18 sub-bands starting
 | 
				
			||||||
 | 
					 * at mantissa number 37. Each sub-band is 12 bins wide.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * There are 50 bit allocation sub-bands which cover the entire
 | 
				
			||||||
 | 
					 * frequency range. The sub-bands are of non-uniform width, and
 | 
				
			||||||
 | 
					 * approximate a 1/6 octave scale.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The following structures are filled in by their corresponding parse_*
 | 
				
			||||||
 | 
					 * functions. See http://www.atsc.org/Standards/A52/a_52.pdf for
 | 
				
			||||||
 | 
					 * full details on each field. Indented fields are used to denote
 | 
				
			||||||
 | 
					 * conditional fields.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct syncinfo_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32	magic;
 | 
				
			||||||
 | 
						/* Sync word == 0x0B77 */
 | 
				
			||||||
 | 
						uint_16   syncword;
 | 
				
			||||||
 | 
						/* crc for the first 5/8 of the sync block */
 | 
				
			||||||
 | 
						/* uint_16   crc1; */
 | 
				
			||||||
 | 
						/* Stream Sampling Rate (kHz) 0 = 48, 1 = 44.1, 2 = 32, 3 = reserved */
 | 
				
			||||||
 | 
						uint_16		fscod;	
 | 
				
			||||||
 | 
						/* Frame size code */
 | 
				
			||||||
 | 
						uint_16		frmsizecod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Information not in the AC-3 bitstream, but derived */
 | 
				
			||||||
 | 
						/* Frame size in 16 bit words */
 | 
				
			||||||
 | 
						uint_16 frame_size;
 | 
				
			||||||
 | 
						/* Bit rate in kilobits */
 | 
				
			||||||
 | 
						uint_16 bit_rate;
 | 
				
			||||||
 | 
						/* sampling rate in hertz */
 | 
				
			||||||
 | 
						uint_32 sampling_rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} syncinfo_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct bsi_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32	magic;
 | 
				
			||||||
 | 
						/* Bit stream identification == 0x8 */
 | 
				
			||||||
 | 
						uint_16 bsid;	
 | 
				
			||||||
 | 
						/* Bit stream mode */
 | 
				
			||||||
 | 
						uint_16 bsmod;
 | 
				
			||||||
 | 
						/* Audio coding mode */
 | 
				
			||||||
 | 
						uint_16 acmod;
 | 
				
			||||||
 | 
						/* If we're using the centre channel then */
 | 
				
			||||||
 | 
							/* centre mix level */
 | 
				
			||||||
 | 
							uint_16 cmixlev;
 | 
				
			||||||
 | 
						/* If we're using the surround channel then */
 | 
				
			||||||
 | 
							/* surround mix level */
 | 
				
			||||||
 | 
							uint_16 surmixlev;
 | 
				
			||||||
 | 
						/* If we're in 2/0 mode then */
 | 
				
			||||||
 | 
							/* Dolby surround mix level - NOT USED - */
 | 
				
			||||||
 | 
							uint_16 dsurmod;
 | 
				
			||||||
 | 
						/* Low frequency effects on */
 | 
				
			||||||
 | 
						uint_16 lfeon;
 | 
				
			||||||
 | 
						/* Dialogue Normalization level */
 | 
				
			||||||
 | 
						uint_16 dialnorm;
 | 
				
			||||||
 | 
						/* Compression exists */
 | 
				
			||||||
 | 
						uint_16 compre;
 | 
				
			||||||
 | 
							/* Compression level */
 | 
				
			||||||
 | 
							uint_16 compr;
 | 
				
			||||||
 | 
						/* Language code exists */
 | 
				
			||||||
 | 
						uint_16 langcode;
 | 
				
			||||||
 | 
							/* Language code */
 | 
				
			||||||
 | 
							uint_16 langcod;
 | 
				
			||||||
 | 
						/* Audio production info exists*/
 | 
				
			||||||
 | 
						uint_16 audprodie;
 | 
				
			||||||
 | 
							uint_16 mixlevel;
 | 
				
			||||||
 | 
							uint_16 roomtyp;
 | 
				
			||||||
 | 
						/* If we're in dual mono mode (acmod == 0) then extra stuff */
 | 
				
			||||||
 | 
							uint_16 dialnorm2;
 | 
				
			||||||
 | 
							uint_16 compr2e;
 | 
				
			||||||
 | 
								uint_16 compr2;
 | 
				
			||||||
 | 
							uint_16 langcod2e;
 | 
				
			||||||
 | 
								uint_16 langcod2;
 | 
				
			||||||
 | 
							uint_16 audprodi2e;
 | 
				
			||||||
 | 
								uint_16 mixlevel2;
 | 
				
			||||||
 | 
								uint_16 roomtyp2;
 | 
				
			||||||
 | 
						/* Copyright bit */
 | 
				
			||||||
 | 
						uint_16 copyrightb;
 | 
				
			||||||
 | 
						/* Original bit */
 | 
				
			||||||
 | 
						uint_16 origbs;
 | 
				
			||||||
 | 
						/* Timecode 1 exists */
 | 
				
			||||||
 | 
						uint_16 timecod1e;
 | 
				
			||||||
 | 
							/* Timecode 1 */
 | 
				
			||||||
 | 
							uint_16 timecod1;
 | 
				
			||||||
 | 
						/* Timecode 2 exists */
 | 
				
			||||||
 | 
						uint_16 timecod2e;
 | 
				
			||||||
 | 
							/* Timecode 2 */
 | 
				
			||||||
 | 
							uint_16 timecod2;
 | 
				
			||||||
 | 
						/* Additional bit stream info exists */
 | 
				
			||||||
 | 
						uint_16 addbsie;
 | 
				
			||||||
 | 
							/* Additional bit stream length - 1 (in bytes) */
 | 
				
			||||||
 | 
							uint_16 addbsil;
 | 
				
			||||||
 | 
							/* Additional bit stream information (max 64 bytes) */
 | 
				
			||||||
 | 
							uint_8	addbsi[64];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Information not in the AC-3 bitstream, but derived */
 | 
				
			||||||
 | 
						/* Number of channels (excluding LFE)
 | 
				
			||||||
 | 
						 * Derived from acmod */
 | 
				
			||||||
 | 
						uint_16 nfchans;
 | 
				
			||||||
 | 
					} bsi_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* more pain */
 | 
				
			||||||
 | 
					typedef struct audblk_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32	magic1;
 | 
				
			||||||
 | 
						/* block switch bit indexed by channel num */
 | 
				
			||||||
 | 
						uint_16 blksw[5];
 | 
				
			||||||
 | 
						/* dither enable bit indexed by channel num */
 | 
				
			||||||
 | 
						uint_16 dithflag[5];
 | 
				
			||||||
 | 
						/* dynamic range gain exists */
 | 
				
			||||||
 | 
						uint_16 dynrnge;
 | 
				
			||||||
 | 
							/* dynamic range gain */
 | 
				
			||||||
 | 
							uint_16 dynrng;
 | 
				
			||||||
 | 
						/* if acmod==0 then */
 | 
				
			||||||
 | 
						/* dynamic range 2 gain exists */
 | 
				
			||||||
 | 
						uint_16 dynrng2e;
 | 
				
			||||||
 | 
							/* dynamic range 2 gain */
 | 
				
			||||||
 | 
							uint_16 dynrng2;
 | 
				
			||||||
 | 
						/* coupling strategy exists */
 | 
				
			||||||
 | 
						uint_16 cplstre;
 | 
				
			||||||
 | 
							/* coupling in use */
 | 
				
			||||||
 | 
							uint_16 cplinu;
 | 
				
			||||||
 | 
								/* channel coupled */
 | 
				
			||||||
 | 
								uint_16 chincpl[5];
 | 
				
			||||||
 | 
								/* if acmod==2 then */
 | 
				
			||||||
 | 
									/* Phase flags in use */
 | 
				
			||||||
 | 
									uint_16 phsflginu;
 | 
				
			||||||
 | 
								/* coupling begin frequency code */
 | 
				
			||||||
 | 
								uint_16 cplbegf;
 | 
				
			||||||
 | 
								/* coupling end frequency code */
 | 
				
			||||||
 | 
								uint_16 cplendf;
 | 
				
			||||||
 | 
								/* coupling band structure bits */
 | 
				
			||||||
 | 
								uint_16 cplbndstrc[18];
 | 
				
			||||||
 | 
								/* Do coupling co-ords exist for this channel? */
 | 
				
			||||||
 | 
								uint_16 cplcoe[5];
 | 
				
			||||||
 | 
								/* Master coupling co-ordinate */
 | 
				
			||||||
 | 
								uint_16 mstrcplco[5];
 | 
				
			||||||
 | 
								/* Per coupling band coupling co-ordinates */
 | 
				
			||||||
 | 
								uint_16 cplcoexp[5][18];
 | 
				
			||||||
 | 
								uint_16 cplcomant[5][18];
 | 
				
			||||||
 | 
								/* Phase flags for dual mono */
 | 
				
			||||||
 | 
								uint_16 phsflg[18];
 | 
				
			||||||
 | 
						/* Is there a rematrixing strategy */
 | 
				
			||||||
 | 
						uint_16 rematstr;
 | 
				
			||||||
 | 
							/* Rematrixing bits */
 | 
				
			||||||
 | 
							uint_16 rematflg[4];
 | 
				
			||||||
 | 
						/* Coupling exponent strategy */
 | 
				
			||||||
 | 
						uint_16 cplexpstr;
 | 
				
			||||||
 | 
						/* Exponent strategy for full bandwidth channels */
 | 
				
			||||||
 | 
						uint_16 chexpstr[5];
 | 
				
			||||||
 | 
						/* Exponent strategy for lfe channel */
 | 
				
			||||||
 | 
						uint_16 lfeexpstr;
 | 
				
			||||||
 | 
						/* Channel bandwidth for independent channels */
 | 
				
			||||||
 | 
						uint_16 chbwcod[5];
 | 
				
			||||||
 | 
							/* The absolute coupling exponent */
 | 
				
			||||||
 | 
							uint_16 cplabsexp;
 | 
				
			||||||
 | 
							/* Coupling channel exponents (D15 mode gives 18 * 12 /3  encoded exponents */
 | 
				
			||||||
 | 
							uint_16 cplexps[18 * 12 / 3];
 | 
				
			||||||
 | 
						/* Sanity checking constant */
 | 
				
			||||||
 | 
						uint_32	magic2;
 | 
				
			||||||
 | 
						/* fbw channel exponents */
 | 
				
			||||||
 | 
						uint_16 exps[5][252 / 3];
 | 
				
			||||||
 | 
						/* channel gain range */
 | 
				
			||||||
 | 
						uint_16 gainrng[5];
 | 
				
			||||||
 | 
						/* low frequency exponents */
 | 
				
			||||||
 | 
						uint_16 lfeexps[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Bit allocation info */
 | 
				
			||||||
 | 
						uint_16 baie;
 | 
				
			||||||
 | 
							/* Slow decay code */
 | 
				
			||||||
 | 
							uint_16 sdcycod;
 | 
				
			||||||
 | 
							/* Fast decay code */
 | 
				
			||||||
 | 
							uint_16 fdcycod;
 | 
				
			||||||
 | 
							/* Slow gain code */
 | 
				
			||||||
 | 
							uint_16 sgaincod;
 | 
				
			||||||
 | 
							/* dB per bit code */
 | 
				
			||||||
 | 
							uint_16 dbpbcod;
 | 
				
			||||||
 | 
							/* masking floor code */
 | 
				
			||||||
 | 
							uint_16 floorcod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* SNR offset info */
 | 
				
			||||||
 | 
						uint_16 snroffste;
 | 
				
			||||||
 | 
							/* coarse SNR offset */
 | 
				
			||||||
 | 
							uint_16 csnroffst;
 | 
				
			||||||
 | 
							/* coupling fine SNR offset */
 | 
				
			||||||
 | 
							uint_16 cplfsnroffst;
 | 
				
			||||||
 | 
							/* coupling fast gain code */
 | 
				
			||||||
 | 
							uint_16 cplfgaincod;
 | 
				
			||||||
 | 
							/* fbw fine SNR offset */
 | 
				
			||||||
 | 
							uint_16 fsnroffst[5];
 | 
				
			||||||
 | 
							/* fbw fast gain code */
 | 
				
			||||||
 | 
							uint_16 fgaincod[5];
 | 
				
			||||||
 | 
							/* lfe fine SNR offset */
 | 
				
			||||||
 | 
							uint_16 lfefsnroffst;
 | 
				
			||||||
 | 
							/* lfe fast gain code */
 | 
				
			||||||
 | 
							uint_16 lfefgaincod;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* Coupling leak info */
 | 
				
			||||||
 | 
						uint_16 cplleake;
 | 
				
			||||||
 | 
							/* coupling fast leak initialization */
 | 
				
			||||||
 | 
							uint_16 cplfleak;
 | 
				
			||||||
 | 
							/* coupling slow leak initialization */
 | 
				
			||||||
 | 
							uint_16 cplsleak;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* delta bit allocation info */
 | 
				
			||||||
 | 
						uint_16 deltbaie;
 | 
				
			||||||
 | 
							/* coupling delta bit allocation exists */
 | 
				
			||||||
 | 
							uint_16 cpldeltbae;
 | 
				
			||||||
 | 
							/* fbw delta bit allocation exists */
 | 
				
			||||||
 | 
							uint_16 deltbae[5];
 | 
				
			||||||
 | 
							/* number of cpl delta bit segments */
 | 
				
			||||||
 | 
							uint_16 cpldeltnseg;
 | 
				
			||||||
 | 
								/* coupling delta bit allocation offset */
 | 
				
			||||||
 | 
								uint_16 cpldeltoffst[8];
 | 
				
			||||||
 | 
								/* coupling delta bit allocation length */
 | 
				
			||||||
 | 
								uint_16 cpldeltlen[8];
 | 
				
			||||||
 | 
								/* coupling delta bit allocation length */
 | 
				
			||||||
 | 
								uint_16 cpldeltba[8];
 | 
				
			||||||
 | 
							/* number of delta bit segments */
 | 
				
			||||||
 | 
							uint_16 deltnseg[5];
 | 
				
			||||||
 | 
								/* fbw delta bit allocation offset */
 | 
				
			||||||
 | 
								uint_16 deltoffst[5][8];
 | 
				
			||||||
 | 
								/* fbw delta bit allocation length */
 | 
				
			||||||
 | 
								uint_16 deltlen[5][8];
 | 
				
			||||||
 | 
								/* fbw delta bit allocation length */
 | 
				
			||||||
 | 
								uint_16 deltba[5][8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* skip length exists */
 | 
				
			||||||
 | 
						uint_16 skiple;
 | 
				
			||||||
 | 
							/* skip length */
 | 
				
			||||||
 | 
							uint_16 skipl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Removed Feb 2000 -ah
 | 
				
			||||||
 | 
						/* channel mantissas */
 | 
				
			||||||
 | 
						//uint_16 chmant[5][256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* coupling mantissas */
 | 
				
			||||||
 | 
						uint_16 cplmant[256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Removed Feb 2000 -ah
 | 
				
			||||||
 | 
						/* coupling mantissas */
 | 
				
			||||||
 | 
						//uint_16 lfemant[7];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*  -- Information not in the bitstream, but derived thereof  -- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Number of coupling sub-bands */
 | 
				
			||||||
 | 
						uint_16 ncplsubnd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Number of combined coupling sub-bands
 | 
				
			||||||
 | 
						 * Derived from ncplsubnd and cplbndstrc */
 | 
				
			||||||
 | 
						uint_16 ncplbnd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Number of exponent groups by channel
 | 
				
			||||||
 | 
						 * Derived from strmant, endmant */
 | 
				
			||||||
 | 
						uint_16 nchgrps[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Number of coupling exponent groups
 | 
				
			||||||
 | 
						 * Derived from cplbegf, cplendf, cplexpstr */
 | 
				
			||||||
 | 
						uint_16 ncplgrps;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
						/* End mantissa numbers of fbw channels */
 | 
				
			||||||
 | 
						uint_16 endmant[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Start and end mantissa numbers for the coupling channel */
 | 
				
			||||||
 | 
						uint_16 cplstrtmant;
 | 
				
			||||||
 | 
						uint_16 cplendmant;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Decoded exponent info */
 | 
				
			||||||
 | 
						uint_16 fbw_exp[5][256];
 | 
				
			||||||
 | 
						uint_16 cpl_exp[256];
 | 
				
			||||||
 | 
						uint_16 lfe_exp[7];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Bit allocation pointer results */
 | 
				
			||||||
 | 
						uint_16 fbw_bap[5][256];
 | 
				
			||||||
 | 
						uint_16 cpl_bap[256];
 | 
				
			||||||
 | 
						uint_16 lfe_bap[7];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						uint_32	magic3;
 | 
				
			||||||
 | 
					} audblk_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										494
									
								
								ac3dec/libac3/bit_allocate.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										494
									
								
								ac3dec/libac3/bit_allocate.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,494 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  bit_allocate.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline sint_16 logadd(sint_16 a,sint_16  b);
 | 
				
			||||||
 | 
					static sint_16 calc_lowcomp(sint_16 a,sint_16 b0,sint_16 b1,sint_16 bin);
 | 
				
			||||||
 | 
					static inline uint_16 min(sint_16 a,sint_16 b);
 | 
				
			||||||
 | 
					static inline uint_16 max(sint_16 a,sint_16 b);
 | 
				
			||||||
 | 
					static void ba_compute_psd(sint_16 start, sint_16 end, sint_16 exps[], 
 | 
				
			||||||
 | 
							sint_16 psd[], sint_16 bndpsd[]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ba_compute_excitation(sint_16 start, sint_16 end,sint_16 fgain,
 | 
				
			||||||
 | 
							sint_16 fastleak, sint_16 slowleak, sint_16 is_lfe, sint_16 bndpsd[],
 | 
				
			||||||
 | 
							sint_16 excite[]);
 | 
				
			||||||
 | 
					static void ba_compute_mask(sint_16 start, sint_16 end, uint_16 fscod,
 | 
				
			||||||
 | 
							uint_16 deltbae, uint_16 deltnseg, uint_16 deltoffst[], uint_16 deltba[],
 | 
				
			||||||
 | 
							uint_16 deltlen[], sint_16 excite[], sint_16 mask[]);
 | 
				
			||||||
 | 
					static void ba_compute_bap(sint_16 start, sint_16 end, sint_16 snroffset,
 | 
				
			||||||
 | 
							sint_16 psd[], sint_16 mask[], sint_16 bap[]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Misc LUTs for bit allocation process */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 slowdec[]  = { 0x0f,  0x11,  0x13,  0x15  };
 | 
				
			||||||
 | 
					static sint_16 fastdec[]  = { 0x3f,  0x53,  0x67,  0x7b  };
 | 
				
			||||||
 | 
					static sint_16 slowgain[] = { 0x540, 0x4d8, 0x478, 0x410 };
 | 
				
			||||||
 | 
					static sint_16 dbpbtab[]  = { 0x000, 0x700, 0x900, 0xb00 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint_16 floortab[] = { 0x2f0, 0x2b0, 0x270, 0x230, 0x1f0, 0x170, 0x0f0, 0xf800 };
 | 
				
			||||||
 | 
					static sint_16 fastgain[] = { 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 bndtab[] = {  0,  1,  2,   3,   4,   5,   6,   7,   8,   9, 
 | 
				
			||||||
 | 
					                     10, 11, 12,  13,  14,  15,  16,  17,  18,  19,
 | 
				
			||||||
 | 
					                     20, 21, 22,  23,  24,  25,  26,  27,  28,  31,
 | 
				
			||||||
 | 
					                     34, 37, 40,  43,  46,  49,  55,  61,  67,  73,
 | 
				
			||||||
 | 
					                     79, 85, 97, 109, 121, 133, 157, 181, 205, 229 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 bndsz[]  = { 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 | 
				
			||||||
 | 
					                     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
 | 
				
			||||||
 | 
					                     1,  1,  1,  1,  1,  1,  1,  1,  3,  3,
 | 
				
			||||||
 | 
					                     3,  3,  3,  3,  3,  6,  6,  6,  6,  6,
 | 
				
			||||||
 | 
					                     6, 12, 12, 12, 12, 24, 24, 24, 24, 24 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 masktab[] = { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 | 
				
			||||||
 | 
					                     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 28, 29,
 | 
				
			||||||
 | 
					                     29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34,
 | 
				
			||||||
 | 
					                     34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37,
 | 
				
			||||||
 | 
					                     37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40,
 | 
				
			||||||
 | 
					                     40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
 | 
				
			||||||
 | 
					                     41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43,
 | 
				
			||||||
 | 
					                     43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44,
 | 
				
			||||||
 | 
					                     44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
 | 
				
			||||||
 | 
					                     45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46,
 | 
				
			||||||
 | 
					                     46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
 | 
				
			||||||
 | 
					                     46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
 | 
				
			||||||
 | 
					                     47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48,
 | 
				
			||||||
 | 
					                     48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
 | 
				
			||||||
 | 
					                     48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
 | 
				
			||||||
 | 
					                     49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,  0,  0,  0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 latab[] = { 0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003b, 0x003a, 0x0039,
 | 
				
			||||||
 | 
					                    0x0038, 0x0037, 0x0036, 0x0035, 0x0034, 0x0034, 0x0033, 0x0032,
 | 
				
			||||||
 | 
					                    0x0031, 0x0030, 0x002f, 0x002f, 0x002e, 0x002d, 0x002c, 0x002c,
 | 
				
			||||||
 | 
					                    0x002b, 0x002a, 0x0029, 0x0029, 0x0028, 0x0027, 0x0026, 0x0026,
 | 
				
			||||||
 | 
					                    0x0025, 0x0024, 0x0024, 0x0023, 0x0023, 0x0022, 0x0021, 0x0021,
 | 
				
			||||||
 | 
					                    0x0020, 0x0020, 0x001f, 0x001e, 0x001e, 0x001d, 0x001d, 0x001c,
 | 
				
			||||||
 | 
					                    0x001c, 0x001b, 0x001b, 0x001a, 0x001a, 0x0019, 0x0019, 0x0018,
 | 
				
			||||||
 | 
					                    0x0018, 0x0017, 0x0017, 0x0016, 0x0016, 0x0015, 0x0015, 0x0015,
 | 
				
			||||||
 | 
					                    0x0014, 0x0014, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012,
 | 
				
			||||||
 | 
					                    0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x000f, 0x000f,
 | 
				
			||||||
 | 
					                    0x000f, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, 0x000d,
 | 
				
			||||||
 | 
					                    0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000b, 0x000b, 0x000b,
 | 
				
			||||||
 | 
					                    0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0009, 0x0009, 0x0009,
 | 
				
			||||||
 | 
					                    0x0009, 0x0009, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
 | 
				
			||||||
 | 
					                    0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0006, 0x0006,
 | 
				
			||||||
 | 
					                    0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005,
 | 
				
			||||||
 | 
					                    0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004,
 | 
				
			||||||
 | 
					                    0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
 | 
				
			||||||
 | 
					                    0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
 | 
				
			||||||
 | 
					                    0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002,
 | 
				
			||||||
 | 
					                    0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
 | 
				
			||||||
 | 
					                    0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
 | 
				
			||||||
 | 
					                    0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
 | 
				
			||||||
 | 
					                    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
 | 
				
			||||||
 | 
					                    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
 | 
				
			||||||
 | 
					                    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
 | 
				
			||||||
 | 
					                    0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 | 
				
			||||||
 | 
					                    0x0000, 0x0000, 0x0000, 0x0000};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 hth[][50] = {{ 0x04d0, 0x04d0, 0x0440, 0x0400, 0x03e0, 0x03c0, 0x03b0, 0x03b0,  
 | 
				
			||||||
 | 
					                      0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x0390, 0x0390, 0x0390,  
 | 
				
			||||||
 | 
					                      0x0380, 0x0380, 0x0370, 0x0370, 0x0360, 0x0360, 0x0350, 0x0350,  
 | 
				
			||||||
 | 
					                      0x0340, 0x0340, 0x0330, 0x0320, 0x0310, 0x0300, 0x02f0, 0x02f0,
 | 
				
			||||||
 | 
					                      0x02f0, 0x02f0, 0x0300, 0x0310, 0x0340, 0x0390, 0x03e0, 0x0420,
 | 
				
			||||||
 | 
					                      0x0460, 0x0490, 0x04a0, 0x0460, 0x0440, 0x0440, 0x0520, 0x0800,
 | 
				
			||||||
 | 
					                      0x0840, 0x0840 },
 | 
				
			||||||
 | 
					                      
 | 
				
			||||||
 | 
					                    { 0x04f0, 0x04f0, 0x0460, 0x0410, 0x03e0, 0x03d0, 0x03c0, 0x03b0, 
 | 
				
			||||||
 | 
					                      0x03b0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x0390, 0x0390, 
 | 
				
			||||||
 | 
					                      0x0390, 0x0380, 0x0380, 0x0380, 0x0370, 0x0370, 0x0360, 0x0360, 
 | 
				
			||||||
 | 
					                      0x0350, 0x0350, 0x0340, 0x0340, 0x0320, 0x0310, 0x0300, 0x02f0, 
 | 
				
			||||||
 | 
					                      0x02f0, 0x02f0, 0x02f0, 0x0300, 0x0320, 0x0350, 0x0390, 0x03e0, 
 | 
				
			||||||
 | 
					                      0x0420, 0x0450, 0x04a0, 0x0490, 0x0460, 0x0440, 0x0480, 0x0630, 
 | 
				
			||||||
 | 
					                      0x0840, 0x0840 },
 | 
				
			||||||
 | 
					                      
 | 
				
			||||||
 | 
					                    { 0x0580, 0x0580, 0x04b0, 0x0450, 0x0420, 0x03f0, 0x03e0, 0x03d0, 
 | 
				
			||||||
 | 
					                      0x03c0, 0x03b0, 0x03b0, 0x03b0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 
 | 
				
			||||||
 | 
					                      0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x0390, 0x0390, 0x0390, 0x0390, 
 | 
				
			||||||
 | 
					                      0x0380, 0x0380, 0x0380, 0x0370, 0x0360, 0x0350, 0x0340, 0x0330, 
 | 
				
			||||||
 | 
					                      0x0320, 0x0310, 0x0300, 0x02f0, 0x02f0, 0x02f0, 0x0300, 0x0310, 
 | 
				
			||||||
 | 
					                      0x0330, 0x0350, 0x03c0, 0x0410, 0x0470, 0x04a0, 0x0460, 0x0440, 
 | 
				
			||||||
 | 
					                      0x0450, 0x04e0 }};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 baptab[] = { 0,  1,  1,  1,  1,  1,  2,  2,  3,  3,  3,  4,  4,  5,  5,  6,
 | 
				
			||||||
 | 
					                     6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9, 10, 
 | 
				
			||||||
 | 
					                     10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14,
 | 
				
			||||||
 | 
					                     14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 sdecay;
 | 
				
			||||||
 | 
					static sint_16 fdecay;
 | 
				
			||||||
 | 
					static sint_16 sgain;
 | 
				
			||||||
 | 
					static sint_16 dbknee;
 | 
				
			||||||
 | 
					static sint_16 floor;
 | 
				
			||||||
 | 
					static sint_16 psd[256];
 | 
				
			||||||
 | 
					static sint_16 bndpsd[256];
 | 
				
			||||||
 | 
					static sint_16 excite[256];
 | 
				
			||||||
 | 
					static sint_16 mask[256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint_16
 | 
				
			||||||
 | 
					max(sint_16 a,sint_16 b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (a > b ? a : b);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					static inline uint_16
 | 
				
			||||||
 | 
					min(sint_16 a,sint_16 b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (a < b ? a : b);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline sint_16 
 | 
				
			||||||
 | 
					logadd(sint_16 a,sint_16  b) 
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
						sint_16 c;
 | 
				
			||||||
 | 
						sint_16 address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						c = a - b; 
 | 
				
			||||||
 | 
						address = min((abs(c) >> 1), 255); 
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (c >= 0) 
 | 
				
			||||||
 | 
							return(a + latab[address]); 
 | 
				
			||||||
 | 
						else 
 | 
				
			||||||
 | 
							return(b + latab[address]); 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void bit_allocate(uint_16 fscod, bsi_t *bsi, audblk_t *audblk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_16 i;
 | 
				
			||||||
 | 
						sint_16 fgain;
 | 
				
			||||||
 | 
						sint_16 snroffset;
 | 
				
			||||||
 | 
						sint_16 start;
 | 
				
			||||||
 | 
						sint_16 end;
 | 
				
			||||||
 | 
						sint_16 fastleak;
 | 
				
			||||||
 | 
						sint_16 slowleak;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Only perform bit_allocation if the exponents have changed or we
 | 
				
			||||||
 | 
						 * have new sideband information */
 | 
				
			||||||
 | 
						if (audblk->chexpstr[0]  == 0 && audblk->chexpstr[1] == 0 &&
 | 
				
			||||||
 | 
								audblk->chexpstr[2]  == 0 && audblk->chexpstr[3] == 0 &&
 | 
				
			||||||
 | 
								audblk->chexpstr[4]  == 0 && audblk->cplexpstr   == 0 &&
 | 
				
			||||||
 | 
								audblk->lfeexpstr    == 0 && audblk->baie        == 0 &&
 | 
				
			||||||
 | 
								audblk->snroffste    == 0 && audblk->deltbaie    == 0)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Do some setup before we do the bit alloc */
 | 
				
			||||||
 | 
						sdecay = slowdec[audblk->sdcycod]; 
 | 
				
			||||||
 | 
						fdecay = fastdec[audblk->fdcycod];
 | 
				
			||||||
 | 
						sgain = slowgain[audblk->sgaincod]; 
 | 
				
			||||||
 | 
						dbknee = dbpbtab[audblk->dbpbcod]; 
 | 
				
			||||||
 | 
						floor = floortab[audblk->floorcod]; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* if all the SNR offset constants are zero then the whole block is zero */
 | 
				
			||||||
 | 
						if(!audblk->csnroffst    && !audblk->fsnroffst[0] && 
 | 
				
			||||||
 | 
							 !audblk->fsnroffst[1] && !audblk->fsnroffst[2] && 
 | 
				
			||||||
 | 
							 !audblk->fsnroffst[3] && !audblk->fsnroffst[4] &&
 | 
				
			||||||
 | 
							 !audblk->cplfsnroffst && !audblk->lfefsnroffst)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							memset(audblk->fbw_bap,0,sizeof(uint_16) * 256 * 5);
 | 
				
			||||||
 | 
							memset(audblk->cpl_bap,0,sizeof(uint_16) * 256);
 | 
				
			||||||
 | 
							memset(audblk->lfe_bap,0,sizeof(uint_16) * 7);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
							 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i = 0; i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							start = 0;
 | 
				
			||||||
 | 
							end = audblk->endmant[i] ; 
 | 
				
			||||||
 | 
							fgain = fastgain[audblk->fgaincod[i]]; 
 | 
				
			||||||
 | 
							snroffset = (((audblk->csnroffst - 15) << 4) + audblk->fsnroffst[i]) << 2 ;
 | 
				
			||||||
 | 
							fastleak = 0;
 | 
				
			||||||
 | 
							slowleak = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_psd(start, end, audblk->fbw_exp[i], psd, bndpsd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_excitation(start, end , fgain, fastleak, slowleak, 0, bndpsd, excite);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_mask(start, end, fscod, audblk->deltbae[i], audblk->deltnseg[i], 
 | 
				
			||||||
 | 
									audblk->deltoffst[i], audblk->deltba[i], audblk->deltlen[i], excite, mask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_bap(start, end, snroffset, psd, mask, audblk->fbw_bap[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->cplinu)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							start = audblk->cplstrtmant; 
 | 
				
			||||||
 | 
							end = audblk->cplendmant; 
 | 
				
			||||||
 | 
							fgain = fastgain[audblk->cplfgaincod];
 | 
				
			||||||
 | 
							snroffset = (((audblk->csnroffst - 15) << 4) + audblk->cplfsnroffst) << 2 ;
 | 
				
			||||||
 | 
							fastleak = (audblk->cplfleak << 8) + 768; 
 | 
				
			||||||
 | 
							slowleak = (audblk->cplsleak << 8) + 768;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_psd(start, end, audblk->cpl_exp, psd, bndpsd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_excitation(start, end , fgain, fastleak, slowleak, 0, bndpsd, excite);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_mask(start, end, fscod, audblk->cpldeltbae, audblk->cpldeltnseg, 
 | 
				
			||||||
 | 
									audblk->cpldeltoffst, audblk->cpldeltba, audblk->cpldeltlen, excite, mask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_bap(start, end, snroffset, psd, mask, audblk->cpl_bap);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(bsi->lfeon)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							start = 0;
 | 
				
			||||||
 | 
							end = 7;
 | 
				
			||||||
 | 
							fgain = fastgain[audblk->lfefgaincod];
 | 
				
			||||||
 | 
							snroffset = (((audblk->csnroffst - 15) << 4) + audblk->lfefsnroffst) << 2 ;
 | 
				
			||||||
 | 
							fastleak = 0;
 | 
				
			||||||
 | 
							slowleak = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_psd(start, end, audblk->lfe_exp, psd, bndpsd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_excitation(start, end , fgain, fastleak, slowleak, 1, bndpsd, excite);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Perform no delta bit allocation for lfe */
 | 
				
			||||||
 | 
							ba_compute_mask(start, end, fscod, 2, 0, 0, 0, 0, excite, mask);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ba_compute_bap(start, end, snroffset, psd, mask, audblk->lfe_bap);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ba_compute_psd(sint_16 start, sint_16 end, sint_16 exps[], 
 | 
				
			||||||
 | 
							sint_16 psd[], sint_16 bndpsd[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int bin,i,j,k;
 | 
				
			||||||
 | 
						sint_16 lastbin = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* Map the exponents into dBs */
 | 
				
			||||||
 | 
						for (bin=start; bin<end; bin++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							psd[bin] = (3072 - (exps[bin] << 7)); 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Integrate the psd function over each bit allocation band */
 | 
				
			||||||
 | 
						j = start; 
 | 
				
			||||||
 | 
						k = masktab[start]; 
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						do 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							lastbin = min(bndtab[k] + bndsz[k], end); 
 | 
				
			||||||
 | 
							bndpsd[k] = psd[j]; 
 | 
				
			||||||
 | 
							j++; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (i = j; i < lastbin; i++) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								bndpsd[k] = logadd(bndpsd[k], psd[j]);
 | 
				
			||||||
 | 
								j++; 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							k++; 
 | 
				
			||||||
 | 
						} while (end > lastbin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ba_compute_excitation(sint_16 start, sint_16 end,sint_16 fgain,
 | 
				
			||||||
 | 
							sint_16 fastleak, sint_16 slowleak, sint_16 is_lfe, sint_16 bndpsd[],
 | 
				
			||||||
 | 
							sint_16 excite[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int bin;
 | 
				
			||||||
 | 
						sint_16 bndstrt;
 | 
				
			||||||
 | 
						sint_16 bndend;
 | 
				
			||||||
 | 
						sint_16 lowcomp = 0;
 | 
				
			||||||
 | 
						sint_16 begin = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Compute excitation function */
 | 
				
			||||||
 | 
						bndstrt = masktab[start]; 
 | 
				
			||||||
 | 
						bndend = masktab[end - 1] + 1; 
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (bndstrt == 0) /* For fbw and lfe channels */ 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							lowcomp = calc_lowcomp(lowcomp, bndpsd[0], bndpsd[1], 0); 
 | 
				
			||||||
 | 
							excite[0] = bndpsd[0] - fgain - lowcomp; 
 | 
				
			||||||
 | 
							lowcomp = calc_lowcomp(lowcomp, bndpsd[1], bndpsd[2], 1);
 | 
				
			||||||
 | 
							excite[1] = bndpsd[1] - fgain - lowcomp; 
 | 
				
			||||||
 | 
							begin = 7 ; 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							/* Note: Do not call calc_lowcomp() for the last band of the lfe channel, (bin = 6) */ 
 | 
				
			||||||
 | 
							for (bin = 2; bin < 7; bin++) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								if (!(is_lfe && (bin == 6)))
 | 
				
			||||||
 | 
									lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin); 
 | 
				
			||||||
 | 
								fastleak = bndpsd[bin] - fgain; 
 | 
				
			||||||
 | 
								slowleak = bndpsd[bin] - sgain; 
 | 
				
			||||||
 | 
								excite[bin] = fastleak - lowcomp; 
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (!(is_lfe && (bin == 6)))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (bndpsd[bin] <= bndpsd[bin+1]) 
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										begin = bin + 1 ; 
 | 
				
			||||||
 | 
										break; 
 | 
				
			||||||
 | 
									} 
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							for (bin = begin; bin < min(bndend, 22); bin++) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								if (!(is_lfe && (bin == 6)))
 | 
				
			||||||
 | 
									lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin); 
 | 
				
			||||||
 | 
								fastleak -= fdecay ; 
 | 
				
			||||||
 | 
								fastleak = max(fastleak, bndpsd[bin] - fgain); 
 | 
				
			||||||
 | 
								slowleak -= sdecay ; 
 | 
				
			||||||
 | 
								slowleak = max(slowleak, bndpsd[bin] - sgain); 
 | 
				
			||||||
 | 
								excite[bin] = max(fastleak - lowcomp, slowleak); 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							begin = 22; 
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
 | 
						else /* For coupling channel */ 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							begin = bndstrt; 
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (bin = begin; bin < bndend; bin++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							fastleak -= fdecay; 
 | 
				
			||||||
 | 
							fastleak = max(fastleak, bndpsd[bin] - fgain); 
 | 
				
			||||||
 | 
							slowleak -= sdecay; 
 | 
				
			||||||
 | 
							slowleak = max(slowleak, bndpsd[bin] - sgain); 
 | 
				
			||||||
 | 
							excite[bin] = max(fastleak, slowleak) ; 
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ba_compute_mask(sint_16 start, sint_16 end, uint_16 fscod,
 | 
				
			||||||
 | 
							uint_16 deltbae, uint_16 deltnseg, uint_16 deltoffst[], uint_16 deltba[],
 | 
				
			||||||
 | 
							uint_16 deltlen[], sint_16 excite[], sint_16 mask[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int bin,k;
 | 
				
			||||||
 | 
						sint_16 bndstrt;
 | 
				
			||||||
 | 
						sint_16 bndend;
 | 
				
			||||||
 | 
						sint_16 delta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bndstrt = masktab[start]; 
 | 
				
			||||||
 | 
						bndend = masktab[end - 1] + 1; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Compute the masking curve */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (bin = bndstrt; bin < bndend; bin++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							if (bndpsd[bin] < dbknee) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								excite[bin] += ((dbknee - bndpsd[bin]) >> 2); 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							mask[bin] = max(excite[bin], hth[fscod][bin]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* Perform delta bit modulation if necessary */
 | 
				
			||||||
 | 
						if ((deltbae == DELTA_BIT_REUSE) || (deltbae == DELTA_BIT_NEW)) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							sint_16 band = 0; 
 | 
				
			||||||
 | 
							sint_16 seg = 0; 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							for (seg = 0; seg < deltnseg+1; seg++) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								band += deltoffst[seg]; 
 | 
				
			||||||
 | 
								if (deltba[seg] >= 4) 
 | 
				
			||||||
 | 
								{ 
 | 
				
			||||||
 | 
									delta = (deltba[seg] - 3) << 7;
 | 
				
			||||||
 | 
								} 
 | 
				
			||||||
 | 
								else 
 | 
				
			||||||
 | 
								{ 
 | 
				
			||||||
 | 
									delta = (deltba[seg] - 4) << 7;
 | 
				
			||||||
 | 
								} 
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								for (k = 0; k < deltlen[seg]; k++) 
 | 
				
			||||||
 | 
								{ 
 | 
				
			||||||
 | 
									mask[band] += delta; 
 | 
				
			||||||
 | 
									band++; 
 | 
				
			||||||
 | 
								} 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ba_compute_bap(sint_16 start, sint_16 end, sint_16 snroffset,
 | 
				
			||||||
 | 
							sint_16 psd[], sint_16 mask[], sint_16 bap[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i,j,k;
 | 
				
			||||||
 | 
						sint_16 lastbin = 0;
 | 
				
			||||||
 | 
						sint_16 address = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Compute the bit allocation pointer for each bin */
 | 
				
			||||||
 | 
						i = start; 
 | 
				
			||||||
 | 
						j = masktab[start]; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							lastbin = min(bndtab[j] + bndsz[j], end); 
 | 
				
			||||||
 | 
							mask[j] -= snroffset; 
 | 
				
			||||||
 | 
							mask[j] -= floor; 
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (mask[j] < 0) 
 | 
				
			||||||
 | 
								mask[j] = 0; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mask[j] &= 0x1fe0;
 | 
				
			||||||
 | 
							mask[j] += floor; 
 | 
				
			||||||
 | 
							for (k = i; k < lastbin; k++) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								address = (psd[i] - mask[j]) >> 5; 
 | 
				
			||||||
 | 
								address = min(63, max(0, address)); 
 | 
				
			||||||
 | 
								bap[i] = baptab[address]; 
 | 
				
			||||||
 | 
								i++; 
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							j++; 
 | 
				
			||||||
 | 
						} while (end > lastbin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static sint_16 
 | 
				
			||||||
 | 
					calc_lowcomp(sint_16 a,sint_16 b0,sint_16 b1,sint_16 bin) 
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (bin < 7) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							if ((b0 + 256) == b1)
 | 
				
			||||||
 | 
								a = 384; 
 | 
				
			||||||
 | 
						 	else if (b0 > b1) 
 | 
				
			||||||
 | 
								a = max(0, a - 64); 
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
 | 
						else if (bin < 20) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							if ((b0 + 256) == b1) 
 | 
				
			||||||
 | 
								a = 320; 
 | 
				
			||||||
 | 
							else if (b0 > b1) 
 | 
				
			||||||
 | 
								a = max(0, a - 64) ; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else  
 | 
				
			||||||
 | 
							a = max(0, a - 128); 
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return(a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										24
									
								
								ac3dec/libac3/bit_allocate.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								ac3dec/libac3/bit_allocate.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  bit_allocate.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void bit_allocate(uint_16 fscod, bsi_t *bsi, audblk_t *audblk);
 | 
				
			||||||
							
								
								
									
										133
									
								
								ac3dec/libac3/bitstream.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								ac3dec/libac3/bitstream.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,133 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  bitstream.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - Dec 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free AC-3 audio decoder
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					#include "bitstream.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BUFFER_SIZE 4096
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint_8 buffer[BUFFER_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint_32 *buffer_start, *buffer_end;
 | 
				
			||||||
 | 
					static uint_8 *chunk_start, *chunk_end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_32 bits_left;
 | 
				
			||||||
 | 
					uint_32 current_word;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ssize_t (*bitstream_fill_buffer)(uint_8**,uint_8**);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int bitstream_get_byte(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(chunk_start == chunk_end)
 | 
				
			||||||
 | 
							if (bitstream_fill_buffer(&chunk_start,&chunk_end) <= 0)
 | 
				
			||||||
 | 
								return EOF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (*chunk_start++);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_8 *bitstream_get_buffer_start(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (uint_8 *) buffer_start;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					bitstream_buffer_frame(uint_32 frame_size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint_32 bytes_read;
 | 
				
			||||||
 | 
					  uint_32 num_bytes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bytes_read = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  do
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if(chunk_start > chunk_end)
 | 
				
			||||||
 | 
								printf("argh!\n");
 | 
				
			||||||
 | 
					    if(chunk_start == chunk_end)
 | 
				
			||||||
 | 
					      if (bitstream_fill_buffer(&chunk_start,&chunk_end) <= 0)
 | 
				
			||||||
 | 
					      	return EOF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    num_bytes = chunk_end - chunk_start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(bytes_read + num_bytes > frame_size)
 | 
				
			||||||
 | 
					      num_bytes = frame_size - bytes_read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(&buffer[bytes_read], chunk_start, num_bytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bytes_read += num_bytes;
 | 
				
			||||||
 | 
					    chunk_start += num_bytes;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  while (bytes_read != frame_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  buffer_start = (uint_32 *) buffer;
 | 
				
			||||||
 | 
					  buffer_end   = (uint_32 *) (buffer + frame_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bits_left = 0;
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					bitstream_fill_current()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						current_word = *buffer_start++;
 | 
				
			||||||
 | 
						current_word = swab32(current_word);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The fast paths for _get is in the
 | 
				
			||||||
 | 
					// bitstream.h header file so it can be inlined.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The "bottom half" of this routine is suffixed _bh
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// -ah
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_32
 | 
				
			||||||
 | 
					bitstream_get_bh(uint_32 num_bits)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						num_bits -= bits_left;
 | 
				
			||||||
 | 
						result = (current_word << (32 - bits_left)) >> (32 - bits_left);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bitstream_fill_current();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(num_bits != 0)
 | 
				
			||||||
 | 
							result = (result << num_bits) | (current_word >> (32 - num_bits));
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						bits_left = 32 - num_bits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					bitstream_init(ssize_t(*fill_function)(uint_8**,uint_8**))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Setup the buffer fill callback 
 | 
				
			||||||
 | 
						bitstream_fill_buffer = fill_function;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										76
									
								
								ac3dec/libac3/bitstream.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								ac3dec/libac3/bitstream.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  bitstream.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - Dec 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free AC-3 audio decoder
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//My new and improved vego-matic endian swapping routine
 | 
				
			||||||
 | 
					//(stolen from the kernel)
 | 
				
			||||||
 | 
					#ifdef WORDS_BIGENDIAN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	define swab32(x) (x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	if defined (__i386__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	define swab32(x) __i386_swab32(x)
 | 
				
			||||||
 | 
						static inline uint_32 __i386_swab32(uint_32 x)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							__asm__("bswap %0" : "=r" (x) : "0" (x));
 | 
				
			||||||
 | 
							return x;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	define swab32(x)\
 | 
				
			||||||
 | 
					((((uint_8*)&x)[0] << 24) | (((uint_8*)&x)[1] << 16) |  \
 | 
				
			||||||
 | 
					 (((uint_8*)&x)[2] << 8)  | (((uint_8*)&x)[3]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#	endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern uint_32 bits_left;
 | 
				
			||||||
 | 
					extern uint_32 current_word;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void bitstream_init(ssize_t(*fill_function)(uint_8**,uint_8**));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int bitstream_get_byte(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_8 *bitstream_get_buffer_start(void);
 | 
				
			||||||
 | 
					int bitstream_buffer_frame(uint_32 frame_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_32 bitstream_get_bh(uint_32 num_bits);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint_32 
 | 
				
			||||||
 | 
					bitstream_get(uint_32 num_bits)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 result;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(num_bits < bits_left)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							result = (current_word << (32 - bits_left)) >> (32 - num_bits);
 | 
				
			||||||
 | 
							bits_left -= num_bits;
 | 
				
			||||||
 | 
							return result;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return bitstream_get_bh(num_bits);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										353
									
								
								ac3dec/libac3/coeff.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										353
									
								
								ac3dec/libac3/coeff.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,353 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    coeff.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "decode.h"
 | 
				
			||||||
 | 
					#include "bitstream.h"
 | 
				
			||||||
 | 
					#include "dither.h"
 | 
				
			||||||
 | 
					#include "coeff.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//Lookup tables of 0.15 two's complement quantization values
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static const uint_16 q_1[3] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						( -2 << 15)/3, 0,(  2 << 15)/3 
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint_16 q_2[5] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						( -4 << 15)/5,( -2 << 15)/5, 0,
 | 
				
			||||||
 | 
						(  2 << 15)/5,(  4 << 15)/5
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint_16 q_3[7] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						( -6 << 15)/7,( -4 << 15)/7,( -2 << 15)/7, 0,
 | 
				
			||||||
 | 
						(  2 << 15)/7,(  4 << 15)/7,(  6 << 15)/7
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint_16 q_4[11] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						(-10 << 15)/11,(-8 << 15)/11,(-6 << 15)/11, ( -4 << 15)/11,(-2 << 15)/11,  0,
 | 
				
			||||||
 | 
						(  2 << 15)/11,( 4 << 15)/11,( 6 << 15)/11, (  8 << 15)/11,(10 << 15)/11
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint_16 q_5[15] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						(-14 << 15)/15,(-12 << 15)/15,(-10 << 15)/15,
 | 
				
			||||||
 | 
						( -8 << 15)/15,( -6 << 15)/15,( -4 << 15)/15,
 | 
				
			||||||
 | 
						( -2 << 15)/15,   0          ,(  2 << 15)/15,
 | 
				
			||||||
 | 
						(  4 << 15)/15,(  6 << 15)/15,(  8 << 15)/15,
 | 
				
			||||||
 | 
						( 10 << 15)/15,( 12 << 15)/15,( 14 << 15)/15
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Scale factors for convert_to_float
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint_32 u32_scale_factors[25] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						0x38000000, //2 ^ -(0 + 15)
 | 
				
			||||||
 | 
						0x37800000, //2 ^ -(1 + 15)
 | 
				
			||||||
 | 
						0x37000000, //2 ^ -(2 + 15)
 | 
				
			||||||
 | 
						0x36800000, //2 ^ -(3 + 15)
 | 
				
			||||||
 | 
						0x36000000, //2 ^ -(4 + 15)
 | 
				
			||||||
 | 
						0x35800000, //2 ^ -(5 + 15)
 | 
				
			||||||
 | 
						0x35000000, //2 ^ -(6 + 15)
 | 
				
			||||||
 | 
						0x34800000, //2 ^ -(7 + 15)
 | 
				
			||||||
 | 
						0x34000000, //2 ^ -(8 + 15)
 | 
				
			||||||
 | 
						0x33800000, //2 ^ -(9 + 15)
 | 
				
			||||||
 | 
						0x33000000, //2 ^ -(10 + 15)
 | 
				
			||||||
 | 
						0x32800000, //2 ^ -(11 + 15)
 | 
				
			||||||
 | 
						0x32000000, //2 ^ -(12 + 15)
 | 
				
			||||||
 | 
						0x31800000, //2 ^ -(13 + 15)
 | 
				
			||||||
 | 
						0x31000000, //2 ^ -(14 + 15)
 | 
				
			||||||
 | 
						0x30800000, //2 ^ -(15 + 15)
 | 
				
			||||||
 | 
						0x30000000, //2 ^ -(16 + 15)
 | 
				
			||||||
 | 
						0x2f800000, //2 ^ -(17 + 15)
 | 
				
			||||||
 | 
						0x2f000000, //2 ^ -(18 + 15)
 | 
				
			||||||
 | 
						0x2e800000, //2 ^ -(19 + 15)
 | 
				
			||||||
 | 
						0x2e000000, //2 ^ -(20 + 15)
 | 
				
			||||||
 | 
						0x2d800000, //2 ^ -(21 + 15)
 | 
				
			||||||
 | 
						0x2d000000, //2 ^ -(22 + 15)
 | 
				
			||||||
 | 
						0x2c800000, //2 ^ -(23 + 15)
 | 
				
			||||||
 | 
						0x2c000000  //2 ^ -(24 + 15)
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static float *scale_factor = (float*)u32_scale_factors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//These store the persistent state of the packed mantissas
 | 
				
			||||||
 | 
					static uint_16 m_1[3];
 | 
				
			||||||
 | 
					static uint_16 m_2[3];
 | 
				
			||||||
 | 
					static uint_16 m_4[2];
 | 
				
			||||||
 | 
					static uint_16 m_1_pointer;
 | 
				
			||||||
 | 
					static uint_16 m_2_pointer;
 | 
				
			||||||
 | 
					static uint_16 m_4_pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Conversion from bap to number of bits in the mantissas
 | 
				
			||||||
 | 
					//zeros account for cases 0,1,2,4 which are special cased
 | 
				
			||||||
 | 
					static uint_16 qnttztab[16] = { 0, 0, 0, 3, 0 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void    coeff_reset(void);
 | 
				
			||||||
 | 
					static sint_16 coeff_get_mantissa(uint_16 bap, uint_16 dithflag);
 | 
				
			||||||
 | 
					static void    coeff_uncouple_ch(float samples[],bsi_t *bsi,audblk_t *audblk,uint_32 ch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Convert a 0.15 fixed point number into IEEE single
 | 
				
			||||||
 | 
					// precision floating point and scale by 2^-exp
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static inline float
 | 
				
			||||||
 | 
					convert_to_float(uint_16 exp, sint_16 mantissa)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						float x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//the scale by 2^-15 is built into the scale factor table
 | 
				
			||||||
 | 
						x = mantissa * scale_factor[exp];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return x;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					coeff_unpack(bsi_t *bsi, audblk_t *audblk, stream_samples_t samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_16 i,j;
 | 
				
			||||||
 | 
						uint_32 done_cpl = 0;
 | 
				
			||||||
 | 
						sint_16 mantissa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						coeff_reset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< bsi->nfchans; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							for(j=0; j < audblk->endmant[i]; j++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								mantissa = coeff_get_mantissa(audblk->fbw_bap[i][j],audblk->dithflag[i]);
 | 
				
			||||||
 | 
								samples[i][j] = convert_to_float(audblk->fbw_exp[i][j],mantissa);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(audblk->cplinu && audblk->chincpl[i] && !(done_cpl))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// ncplmant is equal to 12 * ncplsubnd
 | 
				
			||||||
 | 
								// Don't dither coupling channel until channel separation so that
 | 
				
			||||||
 | 
								// interchannel noise is uncorrelated 
 | 
				
			||||||
 | 
								for(j=audblk->cplstrtmant; j < audblk->cplendmant; j++)
 | 
				
			||||||
 | 
									audblk->cplmant[j] = coeff_get_mantissa(audblk->cpl_bap[j],0);
 | 
				
			||||||
 | 
								done_cpl = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//uncouple the channel if necessary
 | 
				
			||||||
 | 
						if(audblk->cplinu)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							for(i=0; i< bsi->nfchans; i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if(audblk->chincpl[i])
 | 
				
			||||||
 | 
									coeff_uncouple_ch(samples[i],bsi,audblk,i);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(bsi->lfeon)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// There are always 7 mantissas for lfe, no dither for lfe 
 | 
				
			||||||
 | 
							for(j=0; j < 7 ; j++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								mantissa = coeff_get_mantissa(audblk->lfe_bap[j],0);
 | 
				
			||||||
 | 
								samples[5][j] = convert_to_float(audblk->lfe_exp[j],mantissa);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//Fetch a mantissa from the bitstream
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//The mantissa returned is a signed 0.15 fixed point number
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static sint_16
 | 
				
			||||||
 | 
					coeff_get_mantissa(uint_16 bap, uint_16 dithflag)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_16 mantissa;
 | 
				
			||||||
 | 
						uint_16 group_code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//If the bap is 0-5 then we have special cases to take care of
 | 
				
			||||||
 | 
						switch(bap)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								if(dithflag)
 | 
				
			||||||
 | 
									mantissa = dither_gen();
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									mantissa = 0;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
								if(m_1_pointer > 2)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									group_code = bitstream_get(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if(group_code > 26)
 | 
				
			||||||
 | 
										goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									m_1[0] = group_code / 9; 
 | 
				
			||||||
 | 
									m_1[1] = (group_code % 9) / 3; 
 | 
				
			||||||
 | 
									m_1[2] = (group_code % 9) % 3; 
 | 
				
			||||||
 | 
									m_1_pointer = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								mantissa = m_1[m_1_pointer++];
 | 
				
			||||||
 | 
								mantissa = q_1[mantissa];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(m_2_pointer > 2)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									group_code = bitstream_get(7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if(group_code > 124)
 | 
				
			||||||
 | 
										goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									m_2[0] = group_code / 25;
 | 
				
			||||||
 | 
									m_2[1] = (group_code % 25) / 5 ;
 | 
				
			||||||
 | 
									m_2[2] = (group_code % 25) % 5 ; 
 | 
				
			||||||
 | 
									m_2_pointer = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								mantissa = m_2[m_2_pointer++];
 | 
				
			||||||
 | 
								mantissa = q_2[mantissa];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 3:
 | 
				
			||||||
 | 
								mantissa = bitstream_get(3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(mantissa > 6)
 | 
				
			||||||
 | 
									goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mantissa = q_3[mantissa];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 4:
 | 
				
			||||||
 | 
								if(m_4_pointer > 1)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									group_code = bitstream_get(7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if(group_code > 120)
 | 
				
			||||||
 | 
										goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									m_4[0] = group_code / 11;
 | 
				
			||||||
 | 
									m_4[1] = group_code % 11;
 | 
				
			||||||
 | 
									m_4_pointer = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								mantissa = m_4[m_4_pointer++];
 | 
				
			||||||
 | 
								mantissa = q_4[mantissa];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 5:
 | 
				
			||||||
 | 
								mantissa = bitstream_get(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(mantissa > 14)
 | 
				
			||||||
 | 
									goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mantissa = q_5[mantissa];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								mantissa = bitstream_get(qnttztab[bap]);
 | 
				
			||||||
 | 
								mantissa <<= 16 - qnttztab[bap];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return mantissa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error:
 | 
				
			||||||
 | 
						if(!error_flag)
 | 
				
			||||||
 | 
							fprintf(stderr,"** Invalid mantissa - skipping frame **\n");
 | 
				
			||||||
 | 
						error_flag = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Reset the mantissa state
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static void 
 | 
				
			||||||
 | 
					coeff_reset(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						m_1[2] = m_1[1] = m_1[0] = 0;
 | 
				
			||||||
 | 
						m_2[2] = m_2[1] = m_2[0] = 0;
 | 
				
			||||||
 | 
						m_4[1] = m_4[0] = 0;
 | 
				
			||||||
 | 
						m_1_pointer = m_2_pointer = m_4_pointer = 3;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Uncouple the coupling channel into a fbw channel
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					coeff_uncouple_ch(float samples[],bsi_t *bsi,audblk_t *audblk,uint_32 ch)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 bnd = 0;
 | 
				
			||||||
 | 
						uint_32 sub_bnd = 0;
 | 
				
			||||||
 | 
						uint_32 i,j;
 | 
				
			||||||
 | 
						float cpl_coord = 1.0;
 | 
				
			||||||
 | 
						uint_32 cpl_exp_tmp;
 | 
				
			||||||
 | 
						uint_32 cpl_mant_tmp;
 | 
				
			||||||
 | 
						sint_16 mantissa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=audblk->cplstrtmant;i<audblk->cplendmant;)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(!audblk->cplbndstrc[sub_bnd++])
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								cpl_exp_tmp = audblk->cplcoexp[ch][bnd] + 3 * audblk->mstrcplco[ch];
 | 
				
			||||||
 | 
								if(audblk->cplcoexp[ch][bnd] == 15)
 | 
				
			||||||
 | 
									cpl_mant_tmp = (audblk->cplcomant[ch][bnd]) << 11;
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									cpl_mant_tmp = ((0x10) | audblk->cplcomant[ch][bnd]) << 10;
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								cpl_coord = convert_to_float(cpl_exp_tmp,cpl_mant_tmp) * 8.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//Invert the phase for the right channel if necessary
 | 
				
			||||||
 | 
								if(bsi->acmod == 0x2 && audblk->phsflginu && ch == 1 && audblk->phsflg[bnd])
 | 
				
			||||||
 | 
									cpl_coord *= -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								bnd++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(j=0;j < 12; j++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								//Get new dither values for each channel if necessary, so
 | 
				
			||||||
 | 
								//the channels are uncorrelated
 | 
				
			||||||
 | 
								if(audblk->dithflag[ch] && audblk->cpl_bap[i] == 0)
 | 
				
			||||||
 | 
									mantissa = dither_gen();
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									mantissa = audblk->cplmant[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								samples[i]  = cpl_coord * convert_to_float(audblk->cpl_exp[i],mantissa);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								i++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										24
									
								
								ac3dec/libac3/coeff.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								ac3dec/libac3/coeff.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    coeff.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - Feb 2000
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void coeff_unpack(bsi_t *bsi, audblk_t *audblk,stream_samples_t samples);
 | 
				
			||||||
							
								
								
									
										96
									
								
								ac3dec/libac3/crc.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								ac3dec/libac3/crc.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,96 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    crc.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "crc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint_16 crc_lut[256] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011,
 | 
				
			||||||
 | 
						0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,
 | 
				
			||||||
 | 
						0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,
 | 
				
			||||||
 | 
						0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,
 | 
				
			||||||
 | 
						0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,
 | 
				
			||||||
 | 
						0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,
 | 
				
			||||||
 | 
						0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,
 | 
				
			||||||
 | 
						0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,
 | 
				
			||||||
 | 
						0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,
 | 
				
			||||||
 | 
						0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,
 | 
				
			||||||
 | 
						0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,
 | 
				
			||||||
 | 
						0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,
 | 
				
			||||||
 | 
						0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,
 | 
				
			||||||
 | 
						0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,
 | 
				
			||||||
 | 
						0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,
 | 
				
			||||||
 | 
						0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,
 | 
				
			||||||
 | 
						0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,
 | 
				
			||||||
 | 
						0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,
 | 
				
			||||||
 | 
						0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,
 | 
				
			||||||
 | 
						0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,
 | 
				
			||||||
 | 
						0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,
 | 
				
			||||||
 | 
						0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,
 | 
				
			||||||
 | 
						0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,
 | 
				
			||||||
 | 
						0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,
 | 
				
			||||||
 | 
						0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,
 | 
				
			||||||
 | 
						0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,
 | 
				
			||||||
 | 
						0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,
 | 
				
			||||||
 | 
						0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,
 | 
				
			||||||
 | 
						0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,
 | 
				
			||||||
 | 
						0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,
 | 
				
			||||||
 | 
						0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,
 | 
				
			||||||
 | 
						0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint_16 state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					crc_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						state = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void crc_process_byte(uint_8 data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						state = crc_lut[data ^ (state>>8)] ^ (state<<8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					crc_process_frame(uint_8 *data,uint_32 num_bytes)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0;i<num_bytes;i++)
 | 
				
			||||||
 | 
							crc_process_byte(data[i]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					crc_validate(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return(state  == 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								ac3dec/libac3/crc.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								ac3dec/libac3/crc.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  crc.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					int crc_validate(void);
 | 
				
			||||||
 | 
					void crc_init(void);
 | 
				
			||||||
 | 
					void crc_process_byte(uint_8 data);
 | 
				
			||||||
 | 
					void crc_process_frame(uint_8 *data,uint_32 num_bytes);
 | 
				
			||||||
							
								
								
									
										58
									
								
								ac3dec/libac3/debug.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ac3dec/libac3/debug.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * debug.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int debug_level = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Determine is debug output is required.
 | 
				
			||||||
 | 
					// We could potentially have multiple levels of debug info
 | 
				
			||||||
 | 
					int debug_is_on(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *env_var;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(debug_level < 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  env_var = getenv("AC3_DEBUG");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (env_var)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								debug_level = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								debug_level = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return debug_level;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//If you don't have gcc, then ya don't get debug output
 | 
				
			||||||
 | 
					#ifndef __GNUC__
 | 
				
			||||||
 | 
					void dprintf(char fmt[],...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int foo = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										37
									
								
								ac3dec/libac3/debug.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ac3dec/libac3/debug.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * debug.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int debug_is_on(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUC__
 | 
				
			||||||
 | 
					#define dprintf(format,args...)\
 | 
				
			||||||
 | 
					{\
 | 
				
			||||||
 | 
						if (debug_is_on())\
 | 
				
			||||||
 | 
						{\
 | 
				
			||||||
 | 
							fprintf(stderr,format,## args);\
 | 
				
			||||||
 | 
						}\
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					void dprintf(char fmt[],...);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										150
									
								
								ac3dec/libac3/decode.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								ac3dec/libac3/decode.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,150 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    decode.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_CONFIG_H
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					#endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					#include "bitstream.h"
 | 
				
			||||||
 | 
					#include "imdct.h"
 | 
				
			||||||
 | 
					#include "exponent.h"
 | 
				
			||||||
 | 
					#include "coeff.h"
 | 
				
			||||||
 | 
					#include "bit_allocate.h"
 | 
				
			||||||
 | 
					#include "parse.h"
 | 
				
			||||||
 | 
					#include "crc.h"
 | 
				
			||||||
 | 
					#include "stats.h"
 | 
				
			||||||
 | 
					#include "rematrix.h"
 | 
				
			||||||
 | 
					#include "sanity_check.h"
 | 
				
			||||||
 | 
					#include "downmix.h"
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//our global config structure
 | 
				
			||||||
 | 
					ac3_config_t ac3_config;
 | 
				
			||||||
 | 
					uint_32 error_flag = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static audblk_t audblk;
 | 
				
			||||||
 | 
					static bsi_t bsi;
 | 
				
			||||||
 | 
					static syncinfo_t syncinfo;
 | 
				
			||||||
 | 
					static uint_32 frame_count = 0;
 | 
				
			||||||
 | 
					static uint_32 done_banner;
 | 
				
			||||||
 | 
					static ac3_frame_t frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//the floating point samples for one audblk
 | 
				
			||||||
 | 
					static stream_samples_t samples;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//the integer samples for the entire frame (with enough space for 2 ch out)
 | 
				
			||||||
 | 
					//if this size change, be sure to change the size when muting
 | 
				
			||||||
 | 
					static sint_16 s16_samples[6 * 6 * 256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					ac3_init(ac3_config_t *config)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						memcpy(&ac3_config,config,sizeof(ac3_config_t));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bitstream_init(config->fill_buffer_callback);
 | 
				
			||||||
 | 
						imdct_init();
 | 
				
			||||||
 | 
						sanity_check_init(&syncinfo,&bsi,&audblk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						frame.audio_data = s16_samples;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ac3_frame_t*
 | 
				
			||||||
 | 
					ac3_decode_frame(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//find a syncframe and parse
 | 
				
			||||||
 | 
						if (parse_syncinfo(&syncinfo) < 0)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						if(error_flag)
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dprintf("(decode) begin frame %d\n",frame_count++);
 | 
				
			||||||
 | 
						frame.sampling_rate = syncinfo.sampling_rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						parse_bsi(&bsi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!done_banner && !(ac3_config.flags & AC3_QUIET))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							stats_print_banner(&syncinfo,&bsi);
 | 
				
			||||||
 | 
							done_banner = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i < 6; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//Initialize freq/time sample storage
 | 
				
			||||||
 | 
							memset(samples,0,sizeof(float) * 256 * (bsi.nfchans + bsi.lfeon));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Extract most of the audblk info from the bitstream
 | 
				
			||||||
 | 
							// (minus the mantissas 
 | 
				
			||||||
 | 
							parse_audblk(&bsi,&audblk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Take the differential exponent data and turn it into
 | 
				
			||||||
 | 
							// absolute exponents 
 | 
				
			||||||
 | 
							exponent_unpack(&bsi,&audblk); 
 | 
				
			||||||
 | 
							if(error_flag)
 | 
				
			||||||
 | 
								goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Figure out how many bits per mantissa 
 | 
				
			||||||
 | 
							bit_allocate(syncinfo.fscod,&bsi,&audblk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Extract the mantissas from the stream and
 | 
				
			||||||
 | 
							// generate floating point frequency coefficients
 | 
				
			||||||
 | 
							coeff_unpack(&bsi,&audblk,samples);
 | 
				
			||||||
 | 
							if(error_flag)
 | 
				
			||||||
 | 
								goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(bsi.acmod == 0x2)
 | 
				
			||||||
 | 
								rematrix(&audblk,samples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Convert the frequency samples into time samples 
 | 
				
			||||||
 | 
							imdct(&bsi,&audblk,samples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Downmix into the requested number of channels
 | 
				
			||||||
 | 
							// and convert floating point to sint_16
 | 
				
			||||||
 | 
							downmix(&bsi,samples,&s16_samples[i * ac3_config.num_output_ch * 256]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sanity_check(&syncinfo,&bsi,&audblk);
 | 
				
			||||||
 | 
							if(error_flag)
 | 
				
			||||||
 | 
								goto error;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						parse_auxdata(&syncinfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &frame;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					error:
 | 
				
			||||||
 | 
						//mute the frame
 | 
				
			||||||
 | 
						memset(s16_samples,0,sizeof(sint_16) * 256 * 2 * 6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						error_flag = 0;
 | 
				
			||||||
 | 
						return &frame;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								ac3dec/libac3/decode.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ac3dec/libac3/decode.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  decode.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										115
									
								
								ac3dec/libac3/dither.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								ac3dec/libac3/dither.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,115 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    dither.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dither.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const uint_16 dither_lut[256] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
 | 
				
			||||||
 | 
					 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
 | 
				
			||||||
 | 
					 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
 | 
				
			||||||
 | 
					 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
 | 
				
			||||||
 | 
					 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
 | 
				
			||||||
 | 
					 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
 | 
				
			||||||
 | 
					 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
 | 
				
			||||||
 | 
					 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
 | 
				
			||||||
 | 
					 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
 | 
				
			||||||
 | 
					 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
 | 
				
			||||||
 | 
					 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
 | 
				
			||||||
 | 
					 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
 | 
				
			||||||
 | 
					 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
 | 
				
			||||||
 | 
					 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
 | 
				
			||||||
 | 
					 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
 | 
				
			||||||
 | 
					 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
 | 
				
			||||||
 | 
					 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
 | 
				
			||||||
 | 
					 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
 | 
				
			||||||
 | 
					 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
 | 
				
			||||||
 | 
					 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
 | 
				
			||||||
 | 
					 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
 | 
				
			||||||
 | 
					 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
 | 
				
			||||||
 | 
					 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
 | 
				
			||||||
 | 
					 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
 | 
				
			||||||
 | 
					 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
 | 
				
			||||||
 | 
					 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
 | 
				
			||||||
 | 
					 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
 | 
				
			||||||
 | 
					 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
 | 
				
			||||||
 | 
					 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
 | 
				
			||||||
 | 
					 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
 | 
				
			||||||
 | 
					 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
 | 
				
			||||||
 | 
					 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_16 lfsr_state = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// see dither_gen (inline-able) in dither.h
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// this is the old dither_gen with is much slower than the new inlined
 | 
				
			||||||
 | 
					// lut version and is still here because it's easier to understand.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 * Generate eight bits of pseudo-entropy using a 16 bit linear
 | 
				
			||||||
 | 
					 * feedback shift register (LFSR). The primitive polynomial used
 | 
				
			||||||
 | 
					 * is 1 + x^4 + x^14 + x^16.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The distribution is uniform, over the range [-0.707,0.707]
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint_16 dither_gen(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						uint_32 state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//explicitly bring the state into a local var as gcc > 3.0?
 | 
				
			||||||
 | 
						//doesn't know how to optimize out the stores
 | 
				
			||||||
 | 
						state = lfsr_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Generate eight pseudo random bits
 | 
				
			||||||
 | 
						for(i=0;i<8;i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							state <<= 1;	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(state & 0x10000)
 | 
				
			||||||
 | 
								state ^= 0xa011;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						lfsr_state = state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (((((sint_32)state<<8)>>8) * (sint_32) (0.707106 * 256.0))>>16);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										37
									
								
								ac3dec/libac3/dither.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ac3dec/libac3/dither.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    dither.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern uint_16 lfsr_state;
 | 
				
			||||||
 | 
					extern const uint_16 dither_lut[256]; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint_16 dither_gen(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						sint_16 state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						state = dither_lut[lfsr_state >> 8] ^ (lfsr_state << 8);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						lfsr_state = (uint_16) state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ((state * (sint_32) (0.707106 * 256.0))>>8);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										557
									
								
								ac3dec/libac3/downmix.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										557
									
								
								ac3dec/libac3/downmix.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,557 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  downmix.c
 | 
				
			||||||
 | 
					 *    
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - Sept 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Originally based on code by Yuqing Deng.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "decode.h"
 | 
				
			||||||
 | 
					#include "downmix.h"
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Pre-scaled downmix coefficients
 | 
				
			||||||
 | 
					static float cmixlev_lut[4] = { 0.2928, 0.2468, 0.2071, 0.2468 };
 | 
				
			||||||
 | 
					static float smixlev_lut[4] = { 0.2928, 0.2071, 0.0   , 0.2071 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void 
 | 
				
			||||||
 | 
					downmix_3f_2r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp;
 | 
				
			||||||
 | 
						float left_tmp;
 | 
				
			||||||
 | 
						float clev,slev;
 | 
				
			||||||
 | 
						float *centre = 0, *left = 0, *right = 0, *left_sur = 0, *right_sur = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						centre    = samples[1];
 | 
				
			||||||
 | 
						right     = samples[2];
 | 
				
			||||||
 | 
						left_sur  = samples[3];
 | 
				
			||||||
 | 
						right_sur = samples[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clev = cmixlev_lut[bsi->cmixlev];
 | 
				
			||||||
 | 
						slev = smixlev_lut[bsi->surmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++ + clev * *centre   + slev * *left_sur++;
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++ + clev * *centre++ + slev * *right_sur++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 2 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
							// printf("[0] = %.6f, [1] = %.6f\n", left_tmp, right_tmp);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void 
 | 
				
			||||||
 | 
					downmix_3f_2r_to_4ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp, left_tmp, rear_right_tmp, rear_left_tmp;
 | 
				
			||||||
 | 
						float clev,slev;
 | 
				
			||||||
 | 
						float *centre = 0, *left = 0, *right = 0, *left_sur = 0, *right_sur = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						centre    = samples[1];
 | 
				
			||||||
 | 
						right     = samples[2];
 | 
				
			||||||
 | 
						left_sur  = samples[3];
 | 
				
			||||||
 | 
						right_sur = samples[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clev = cmixlev_lut[bsi->cmixlev];
 | 
				
			||||||
 | 
						slev = smixlev_lut[bsi->surmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++  + clev * *centre;
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++ + clev * *centre++;
 | 
				
			||||||
 | 
							rear_left_tmp = 0.4142f * *left_sur++;
 | 
				
			||||||
 | 
							rear_right_tmp = 0.4142f * *right_sur++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 4 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 4 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 4 + 2] = (sint_16) (rear_left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 4 + 3] = (sint_16) (rear_right_tmp * 32767.0f);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
							printf("[0] = %.6f, [1] = %.6f, [2] = %.6f, [3] = %.6f\n",
 | 
				
			||||||
 | 
									left_tmp, right_tmp, rear_left_tmp, rear_right_tmp);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void 
 | 
				
			||||||
 | 
					downmix_3f_2r_to_6ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp, centre_tmp, left_tmp, rear_right_tmp, rear_left_tmp, lfe_tmp;
 | 
				
			||||||
 | 
						float clev,slev;
 | 
				
			||||||
 | 
						float *centre = 0, *left = 0, *right = 0, *left_sur = 0, *right_sur = 0, *lfe = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						centre    = samples[1];
 | 
				
			||||||
 | 
						right     = samples[2];
 | 
				
			||||||
 | 
						left_sur  = samples[3];
 | 
				
			||||||
 | 
						right_sur = samples[4];
 | 
				
			||||||
 | 
						lfe	  = samples[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clev = cmixlev_lut[bsi->cmixlev];
 | 
				
			||||||
 | 
						slev = smixlev_lut[bsi->surmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++;
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++;
 | 
				
			||||||
 | 
							centre_tmp = 0.4142f * *centre++;
 | 
				
			||||||
 | 
							rear_left_tmp = 0.4142f * *left_sur++;
 | 
				
			||||||
 | 
							rear_right_tmp = 0.4142f * *right_sur++;
 | 
				
			||||||
 | 
							lfe_tmp = bsi->lfeon ? 0.4142f * *lfe++ : (float)0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 6 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 6 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 6 + 2] = (sint_16) (rear_left_tmp * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 6 + 3] = (sint_16) (rear_right_tmp * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 6 + 4] = (sint_16) (centre_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 6 + 5] = (sint_16) (lfe_tmp * 32767.0f);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
							printf("[0] = %.6f, [1] = %.6f, [2] = %.6f, [3] = %.6f, [4] = %.6f, [5] = %.6f\n",
 | 
				
			||||||
 | 
									left_tmp, right_tmp, rear_left_tmp, rear_right_tmp,
 | 
				
			||||||
 | 
									centre_tmp, lfe_tmp);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_2f_2r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp;
 | 
				
			||||||
 | 
						float left_tmp;
 | 
				
			||||||
 | 
						float slev;
 | 
				
			||||||
 | 
						float *left = 0, *right = 0, *left_sur = 0, *right_sur = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						right     = samples[1];
 | 
				
			||||||
 | 
						left_sur  = samples[2];
 | 
				
			||||||
 | 
						right_sur = samples[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						slev = smixlev_lut[bsi->surmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++  + slev * *left_sur++;
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++ + slev * *right_sur++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 2 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_3f_1r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp;
 | 
				
			||||||
 | 
						float left_tmp;
 | 
				
			||||||
 | 
						float clev,slev;
 | 
				
			||||||
 | 
						float *centre = 0, *left = 0, *right = 0, *sur = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						centre    = samples[1];
 | 
				
			||||||
 | 
						right     = samples[2];
 | 
				
			||||||
 | 
						//Mono surround
 | 
				
			||||||
 | 
						sur = samples[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clev = cmixlev_lut[bsi->cmixlev];
 | 
				
			||||||
 | 
						slev = smixlev_lut[bsi->surmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++  + clev * *centre++ + slev * *sur;
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++ + clev * *centre   + slev * *sur++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 2 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_2f_1r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp;
 | 
				
			||||||
 | 
						float left_tmp;
 | 
				
			||||||
 | 
						float slev;
 | 
				
			||||||
 | 
						float *left = 0, *right = 0, *sur = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						right     = samples[1];
 | 
				
			||||||
 | 
						//Mono surround
 | 
				
			||||||
 | 
						sur = samples[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						slev = smixlev_lut[bsi->surmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++  + slev * *sur;
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++ + slev * *sur++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 2 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_3f_0r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float right_tmp;
 | 
				
			||||||
 | 
						float left_tmp;
 | 
				
			||||||
 | 
						float clev;
 | 
				
			||||||
 | 
						float *centre = 0, *left = 0, *right = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						centre    = samples[1];
 | 
				
			||||||
 | 
						right     = samples[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clev = cmixlev_lut[bsi->cmixlev];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							left_tmp = 0.4142f * *left++  + clev * *centre; 
 | 
				
			||||||
 | 
							right_tmp= 0.4142f * *right++ + clev * *centre++;   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 2 ]    = (sint_16) (left_tmp  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_2f_0r_to_6ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float *left = 0, *right = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						right     = samples[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							s16_samples[j * 6 ]    = (sint_16) (*left++  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 6 + 1] = (sint_16) (*right++ * 32767.0f);
 | 
				
			||||||
 | 
						} //FIXME enable output on surround channels, too.
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_2f_0r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float *left = 0, *right = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						left      = samples[0];
 | 
				
			||||||
 | 
						right     = samples[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							s16_samples[j * 2 ]    = (sint_16) (*left++  * 32767.0f);
 | 
				
			||||||
 | 
							s16_samples[j * 2 + 1] = (sint_16) (*right++ * 32767.0f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					downmix_1f_0r_to_2ch(float *centre,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 j;
 | 
				
			||||||
 | 
						float tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Mono program!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							tmp =  32767.0f * 0.7071f * *centre++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s16_samples[j * 2 ] = s16_samples[j * 2 + 1] = (sint_16) tmp;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Downmix into 2 or 4 channels  (4 ch isn't in quite yet)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The downmix function names have the following format
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// downmix_Xf_Yr_to_[2|4|6]ch[_dolby]
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// where X        = number of front channels
 | 
				
			||||||
 | 
					//       Y        = number of rear channels
 | 
				
			||||||
 | 
					//       [2|4]    = number of output channels
 | 
				
			||||||
 | 
					//       [_dolby] = with or without dolby surround mix
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void downmix(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(bsi->acmod > 7)
 | 
				
			||||||
 | 
							dprintf("(downmix) invalid acmod number\n"); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						//There are two main cases, with or without Dolby Surround
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						if(ac3_config.flags & AC3_DOLBY_SURR_ENABLE)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"Dolby Surround Mixes not currently enabled\n");
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Non-Dolby surround downmixes
 | 
				
			||||||
 | 
						switch(bsi->acmod)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// 3/2
 | 
				
			||||||
 | 
							case 7:
 | 
				
			||||||
 | 
								switch (ac3_config.num_output_ch) {
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									downmix_3f_2r_to_2ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 4:
 | 
				
			||||||
 | 
									downmix_3f_2r_to_4ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 6:
 | 
				
			||||||
 | 
									downmix_3f_2r_to_6ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 3/2 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 2/2
 | 
				
			||||||
 | 
							case 6:
 | 
				
			||||||
 | 
								if (ac3_config.num_output_ch != 2) {
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 2/2 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								downmix_2f_2r_to_2ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 3/1
 | 
				
			||||||
 | 
							case 5:
 | 
				
			||||||
 | 
								if (ac3_config.num_output_ch != 2) {
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 3/1 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								downmix_3f_1r_to_2ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 2/1
 | 
				
			||||||
 | 
							case 4:
 | 
				
			||||||
 | 
								if (ac3_config.num_output_ch != 2) {
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 2/1 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								downmix_2f_1r_to_2ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 3/0
 | 
				
			||||||
 | 
							case 3:
 | 
				
			||||||
 | 
								if (ac3_config.num_output_ch != 2) {
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 3/0 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								downmix_3f_0r_to_2ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 2/0 - 2f_0r_to_6ch not really, but allows -D pcm.surround51:1 with 2/0 and 3/2 input (VDR e.g.)
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
								switch (ac3_config.num_output_ch) {
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									downmix_2f_0r_to_2ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 6:
 | 
				
			||||||
 | 
									downmix_2f_0r_to_6ch(bsi,samples,s16_samples);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 2/0 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 1/0
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
								if (ac3_config.num_output_ch != 2) {
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 1/0 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								downmix_1f_0r_to_2ch(samples[0],s16_samples);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 1+1
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								if (ac3_config.num_output_ch != 2) {
 | 
				
			||||||
 | 
									fprintf(stderr,"unsupported 1/1 channels %d\n", ac3_config.num_output_ch);
 | 
				
			||||||
 | 
									exit(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								downmix_1f_0r_to_2ch(samples[ac3_config.dual_mono_ch_sel],s16_samples);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//the dolby mixes lay here for the time being
 | 
				
			||||||
 | 
						switch(bsi->acmod)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// 3/2
 | 
				
			||||||
 | 
							case 7:
 | 
				
			||||||
 | 
								left      = samples[0];
 | 
				
			||||||
 | 
								centre    = samples[1];
 | 
				
			||||||
 | 
								right     = samples[2];
 | 
				
			||||||
 | 
								left_sur  = samples[3];
 | 
				
			||||||
 | 
								right_sur = samples[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp = 0.2265f * *left_sur++ + 0.2265f * *right_sur++;
 | 
				
			||||||
 | 
									left_tmp  = -1 * right_tmp;
 | 
				
			||||||
 | 
									right_tmp += 0.3204f * *right++ + 0.2265f * *centre;
 | 
				
			||||||
 | 
									left_tmp  += 0.3204f * *left++  + 0.2265f * *centre++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = left_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 2/2
 | 
				
			||||||
 | 
							case 6:
 | 
				
			||||||
 | 
								left      = samples[0];
 | 
				
			||||||
 | 
								right     = samples[1];
 | 
				
			||||||
 | 
								left_sur  = samples[2];
 | 
				
			||||||
 | 
								right_sur = samples[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp = 0.2265f * *left_sur++ + 0.2265f * *right_sur++;
 | 
				
			||||||
 | 
									left_tmp  = -1 * right_tmp;
 | 
				
			||||||
 | 
									right_tmp += 0.3204f * *right++;
 | 
				
			||||||
 | 
									left_tmp  += 0.3204f * *left++ ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = left_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 3/1
 | 
				
			||||||
 | 
							case 5:
 | 
				
			||||||
 | 
								left      = samples[0];
 | 
				
			||||||
 | 
								centre    = samples[1];
 | 
				
			||||||
 | 
								right     = samples[2];
 | 
				
			||||||
 | 
								//Mono surround
 | 
				
			||||||
 | 
								right_sur = samples[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp =  0.2265f * *right_sur++;
 | 
				
			||||||
 | 
									left_tmp  = -1 * right_tmp;
 | 
				
			||||||
 | 
									right_tmp += 0.3204f * *right++ + 0.2265f * *centre;
 | 
				
			||||||
 | 
									left_tmp  += 0.3204f * *left++  + 0.2265f * *centre++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = left_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 2/1
 | 
				
			||||||
 | 
							case 4:
 | 
				
			||||||
 | 
								left      = samples[0];
 | 
				
			||||||
 | 
								right     = samples[1];
 | 
				
			||||||
 | 
								//Mono surround
 | 
				
			||||||
 | 
								right_sur = samples[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp =  0.2265f * *right_sur++;
 | 
				
			||||||
 | 
									left_tmp  = -1 * right_tmp;
 | 
				
			||||||
 | 
									right_tmp += 0.3204f * *right++; 
 | 
				
			||||||
 | 
									left_tmp  += 0.3204f * *left++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = left_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 3/0
 | 
				
			||||||
 | 
							case 3:
 | 
				
			||||||
 | 
								left      = samples[0];
 | 
				
			||||||
 | 
								centre    = samples[1];
 | 
				
			||||||
 | 
								right     = samples[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp = 0.3204f * *right++ + 0.2265f * *centre;
 | 
				
			||||||
 | 
									left_tmp  = 0.3204f * *left++  + 0.2265f * *centre++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = left_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 2/0
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
							//Do nothing!
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 1/0
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
								//Mono program!
 | 
				
			||||||
 | 
								right = samples[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp = 0.7071f * *right++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = right_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 1+1
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								//Dual mono, output selected by user
 | 
				
			||||||
 | 
								right = samples[ac3_config.dual_mono_ch_sel];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (j = 0; j < 256; j++) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									right_tmp = 0.7071f * *right++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									samples[1][j] = right_tmp;
 | 
				
			||||||
 | 
									samples[0][j] = right_tmp;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										28
									
								
								ac3dec/libac3/downmix.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								ac3dec/libac3/downmix.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  downmix.h
 | 
				
			||||||
 | 
					 *    
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - Sept 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Originally based on code by Yeqing Deng.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void downmix(bsi_t* bsi, stream_samples_t stream_samples,sint_16 *s16_samples);
 | 
				
			||||||
							
								
								
									
										135
									
								
								ac3dec/libac3/exponent.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								ac3dec/libac3/exponent.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,135 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    exponent.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "decode.h"
 | 
				
			||||||
 | 
					#include "exponent.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void exp_unpack_ch(uint_16 type,uint_16 expstr,uint_16 ngrps,uint_16 initial_exp, 
 | 
				
			||||||
 | 
							uint_16 exps[], uint_16 *dest);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					exponent_unpack( bsi_t *bsi, audblk_t *audblk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_16 i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< bsi->nfchans; i++)
 | 
				
			||||||
 | 
							exp_unpack_ch(UNPACK_FBW, audblk->chexpstr[i], audblk->nchgrps[i], audblk->exps[i][0], 
 | 
				
			||||||
 | 
									&audblk->exps[i][1], audblk->fbw_exp[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->cplinu)
 | 
				
			||||||
 | 
							exp_unpack_ch(UNPACK_CPL, audblk->cplexpstr, audblk->ncplgrps, audblk->cplabsexp << 1,	
 | 
				
			||||||
 | 
									audblk->cplexps, &audblk->cpl_exp[audblk->cplstrtmant]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(bsi->lfeon)
 | 
				
			||||||
 | 
							exp_unpack_ch(UNPACK_LFE, audblk->lfeexpstr, 2, audblk->lfeexps[0], 
 | 
				
			||||||
 | 
									&audblk->lfeexps[1], audblk->lfe_exp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					exp_unpack_ch(uint_16 type,uint_16 expstr,uint_16 ngrps,uint_16 initial_exp, 
 | 
				
			||||||
 | 
							uint_16 exps[], uint_16 *dest)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_16 i,j;
 | 
				
			||||||
 | 
						sint_16 exp_acc;
 | 
				
			||||||
 | 
						sint_16 exp_1,exp_2,exp_3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(expstr == EXP_REUSE)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Handle the initial absolute exponent */
 | 
				
			||||||
 | 
						exp_acc = initial_exp;
 | 
				
			||||||
 | 
						j = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* In the case of a fbw channel then the initial absolute values is 
 | 
				
			||||||
 | 
						 * also an exponent */
 | 
				
			||||||
 | 
						if(type != UNPACK_CPL)
 | 
				
			||||||
 | 
							dest[j++] = exp_acc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Loop through the groups and fill the dest array appropriately */
 | 
				
			||||||
 | 
						for(i=0; i< ngrps; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(exps[i] > 124)
 | 
				
			||||||
 | 
								goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							exp_1 = exps[i] / 25;
 | 
				
			||||||
 | 
							exp_2 = (exps[i] - (exp_1 * 25)) / 5;
 | 
				
			||||||
 | 
							exp_3 = exps[i] - (exp_1 * 25) - (exp_2 * 5) ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							exp_acc += (exp_1 - 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch(expstr)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								case EXP_D45:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
								case EXP_D25:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
								case EXP_D15:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							exp_acc += (exp_2 - 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch(expstr)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								case EXP_D45:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
								case EXP_D25:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
								case EXP_D15:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							exp_acc += (exp_3 - 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch(expstr)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								case EXP_D45:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
								case EXP_D25:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
								case EXP_D15:
 | 
				
			||||||
 | 
									dest[j++] = exp_acc;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								goto error;
 | 
				
			||||||
 | 
					error:
 | 
				
			||||||
 | 
						if(!error_flag)
 | 
				
			||||||
 | 
							fprintf(stderr,"** Invalid exponent - skipping frame **\n");
 | 
				
			||||||
 | 
						error_flag = 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										28
									
								
								ac3dec/libac3/exponent.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								ac3dec/libac3/exponent.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    exponent.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNPACK_FBW  1
 | 
				
			||||||
 | 
					#define UNPACK_CPL  2
 | 
				
			||||||
 | 
					#define UNPACK_LFE  4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void exponent_unpack( bsi_t *bsi, audblk_t *audblk);
 | 
				
			||||||
							
								
								
									
										479
									
								
								ac3dec/libac3/imdct.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								ac3dec/libac3/imdct.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,479 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  imdct.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "decode.h"
 | 
				
			||||||
 | 
					#include "imdct.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void imdct_do_256(float data[],float delay[]);
 | 
				
			||||||
 | 
					void imdct_do_512(float data[],float delay[]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct complex_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						float real;
 | 
				
			||||||
 | 
						float imag;
 | 
				
			||||||
 | 
					} complex_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define N 512
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 128 point bit-reverse LUT */
 | 
				
			||||||
 | 
					static uint_8 bit_reverse_512[] = {
 | 
				
			||||||
 | 
						0x00, 0x40, 0x20, 0x60, 0x10, 0x50, 0x30, 0x70, 
 | 
				
			||||||
 | 
						0x08, 0x48, 0x28, 0x68, 0x18, 0x58, 0x38, 0x78, 
 | 
				
			||||||
 | 
						0x04, 0x44, 0x24, 0x64, 0x14, 0x54, 0x34, 0x74, 
 | 
				
			||||||
 | 
						0x0c, 0x4c, 0x2c, 0x6c, 0x1c, 0x5c, 0x3c, 0x7c, 
 | 
				
			||||||
 | 
						0x02, 0x42, 0x22, 0x62, 0x12, 0x52, 0x32, 0x72, 
 | 
				
			||||||
 | 
						0x0a, 0x4a, 0x2a, 0x6a, 0x1a, 0x5a, 0x3a, 0x7a, 
 | 
				
			||||||
 | 
						0x06, 0x46, 0x26, 0x66, 0x16, 0x56, 0x36, 0x76, 
 | 
				
			||||||
 | 
						0x0e, 0x4e, 0x2e, 0x6e, 0x1e, 0x5e, 0x3e, 0x7e, 
 | 
				
			||||||
 | 
						0x01, 0x41, 0x21, 0x61, 0x11, 0x51, 0x31, 0x71, 
 | 
				
			||||||
 | 
						0x09, 0x49, 0x29, 0x69, 0x19, 0x59, 0x39, 0x79, 
 | 
				
			||||||
 | 
						0x05, 0x45, 0x25, 0x65, 0x15, 0x55, 0x35, 0x75, 
 | 
				
			||||||
 | 
						0x0d, 0x4d, 0x2d, 0x6d, 0x1d, 0x5d, 0x3d, 0x7d, 
 | 
				
			||||||
 | 
						0x03, 0x43, 0x23, 0x63, 0x13, 0x53, 0x33, 0x73, 
 | 
				
			||||||
 | 
						0x0b, 0x4b, 0x2b, 0x6b, 0x1b, 0x5b, 0x3b, 0x7b, 
 | 
				
			||||||
 | 
						0x07, 0x47, 0x27, 0x67, 0x17, 0x57, 0x37, 0x77, 
 | 
				
			||||||
 | 
						0x0f, 0x4f, 0x2f, 0x6f, 0x1f, 0x5f, 0x3f, 0x7f};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint_8 bit_reverse_256[] = {
 | 
				
			||||||
 | 
						0x00, 0x20, 0x10, 0x30, 0x08, 0x28, 0x18, 0x38, 
 | 
				
			||||||
 | 
						0x04, 0x24, 0x14, 0x34, 0x0c, 0x2c, 0x1c, 0x3c, 
 | 
				
			||||||
 | 
						0x02, 0x22, 0x12, 0x32, 0x0a, 0x2a, 0x1a, 0x3a, 
 | 
				
			||||||
 | 
						0x06, 0x26, 0x16, 0x36, 0x0e, 0x2e, 0x1e, 0x3e, 
 | 
				
			||||||
 | 
						0x01, 0x21, 0x11, 0x31, 0x09, 0x29, 0x19, 0x39, 
 | 
				
			||||||
 | 
						0x05, 0x25, 0x15, 0x35, 0x0d, 0x2d, 0x1d, 0x3d, 
 | 
				
			||||||
 | 
						0x03, 0x23, 0x13, 0x33, 0x0b, 0x2b, 0x1b, 0x3b, 
 | 
				
			||||||
 | 
						0x07, 0x27, 0x17, 0x37, 0x0f, 0x2f, 0x1f, 0x3f};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static complex_t buf[128];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Twiddle factor LUT */
 | 
				
			||||||
 | 
					static complex_t *w[7];
 | 
				
			||||||
 | 
					static complex_t w_1[1];
 | 
				
			||||||
 | 
					static complex_t w_2[2];
 | 
				
			||||||
 | 
					static complex_t w_4[4];
 | 
				
			||||||
 | 
					static complex_t w_8[8];
 | 
				
			||||||
 | 
					static complex_t w_16[16];
 | 
				
			||||||
 | 
					static complex_t w_32[32];
 | 
				
			||||||
 | 
					static complex_t w_64[64];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Twiddle factors for IMDCT */
 | 
				
			||||||
 | 
					static float xcos1[128];
 | 
				
			||||||
 | 
					static float xsin1[128];
 | 
				
			||||||
 | 
					static float xcos2[64];
 | 
				
			||||||
 | 
					static float xsin2[64];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Delay buffer for time domain interleaving */
 | 
				
			||||||
 | 
					static float delay[6][256];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Windowing function for Modified DCT - Thank you acroread */
 | 
				
			||||||
 | 
					static float window[] = {
 | 
				
			||||||
 | 
						0.00014, 0.00024, 0.00037, 0.00051, 0.00067, 0.00086, 0.00107, 0.00130,
 | 
				
			||||||
 | 
						0.00157, 0.00187, 0.00220, 0.00256, 0.00297, 0.00341, 0.00390, 0.00443,
 | 
				
			||||||
 | 
						0.00501, 0.00564, 0.00632, 0.00706, 0.00785, 0.00871, 0.00962, 0.01061,
 | 
				
			||||||
 | 
						0.01166, 0.01279, 0.01399, 0.01526, 0.01662, 0.01806, 0.01959, 0.02121,
 | 
				
			||||||
 | 
						0.02292, 0.02472, 0.02662, 0.02863, 0.03073, 0.03294, 0.03527, 0.03770,
 | 
				
			||||||
 | 
						0.04025, 0.04292, 0.04571, 0.04862, 0.05165, 0.05481, 0.05810, 0.06153,
 | 
				
			||||||
 | 
						0.06508, 0.06878, 0.07261, 0.07658, 0.08069, 0.08495, 0.08935, 0.09389,
 | 
				
			||||||
 | 
						0.09859, 0.10343, 0.10842, 0.11356, 0.11885, 0.12429, 0.12988, 0.13563,
 | 
				
			||||||
 | 
						0.14152, 0.14757, 0.15376, 0.16011, 0.16661, 0.17325, 0.18005, 0.18699,
 | 
				
			||||||
 | 
						0.19407, 0.20130, 0.20867, 0.21618, 0.22382, 0.23161, 0.23952, 0.24757,
 | 
				
			||||||
 | 
						0.25574, 0.26404, 0.27246, 0.28100, 0.28965, 0.29841, 0.30729, 0.31626,
 | 
				
			||||||
 | 
						0.32533, 0.33450, 0.34376, 0.35311, 0.36253, 0.37204, 0.38161, 0.39126,
 | 
				
			||||||
 | 
						0.40096, 0.41072, 0.42054, 0.43040, 0.44030, 0.45023, 0.46020, 0.47019,
 | 
				
			||||||
 | 
						0.48020, 0.49022, 0.50025, 0.51028, 0.52031, 0.53033, 0.54033, 0.55031,
 | 
				
			||||||
 | 
						0.56026, 0.57019, 0.58007, 0.58991, 0.59970, 0.60944, 0.61912, 0.62873,
 | 
				
			||||||
 | 
						0.63827, 0.64774, 0.65713, 0.66643, 0.67564, 0.68476, 0.69377, 0.70269,
 | 
				
			||||||
 | 
						0.71150, 0.72019, 0.72877, 0.73723, 0.74557, 0.75378, 0.76186, 0.76981,
 | 
				
			||||||
 | 
						0.77762, 0.78530, 0.79283, 0.80022, 0.80747, 0.81457, 0.82151, 0.82831,
 | 
				
			||||||
 | 
						0.83496, 0.84145, 0.84779, 0.85398, 0.86001, 0.86588, 0.87160, 0.87716,
 | 
				
			||||||
 | 
						0.88257, 0.88782, 0.89291, 0.89785, 0.90264, 0.90728, 0.91176, 0.91610,
 | 
				
			||||||
 | 
						0.92028, 0.92432, 0.92822, 0.93197, 0.93558, 0.93906, 0.94240, 0.94560,
 | 
				
			||||||
 | 
						0.94867, 0.95162, 0.95444, 0.95713, 0.95971, 0.96217, 0.96451, 0.96674,
 | 
				
			||||||
 | 
						0.96887, 0.97089, 0.97281, 0.97463, 0.97635, 0.97799, 0.97953, 0.98099,
 | 
				
			||||||
 | 
						0.98236, 0.98366, 0.98488, 0.98602, 0.98710, 0.98811, 0.98905, 0.98994,
 | 
				
			||||||
 | 
						0.99076, 0.99153, 0.99225, 0.99291, 0.99353, 0.99411, 0.99464, 0.99513,
 | 
				
			||||||
 | 
						0.99558, 0.99600, 0.99639, 0.99674, 0.99706, 0.99736, 0.99763, 0.99788,
 | 
				
			||||||
 | 
						0.99811, 0.99831, 0.99850, 0.99867, 0.99882, 0.99895, 0.99908, 0.99919,
 | 
				
			||||||
 | 
						0.99929, 0.99938, 0.99946, 0.99953, 0.99959, 0.99965, 0.99969, 0.99974,
 | 
				
			||||||
 | 
						0.99978, 0.99981, 0.99984, 0.99986, 0.99988, 0.99990, 0.99992, 0.99993,
 | 
				
			||||||
 | 
						0.99994, 0.99995, 0.99996, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999,
 | 
				
			||||||
 | 
						0.99999, 0.99999, 0.99999, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000,
 | 
				
			||||||
 | 
						1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void swap_cmplx(complex_t *a, complex_t *b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						complex_t tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tmp = *a;
 | 
				
			||||||
 | 
						*a = *b;
 | 
				
			||||||
 | 
						*b = tmp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline complex_t cmplx_mult(complex_t a, complex_t b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						complex_t ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret.real = a.real * b.real - a.imag * b.imag;
 | 
				
			||||||
 | 
						ret.imag = a.real * b.imag + a.imag * b.real;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void imdct_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i,k;
 | 
				
			||||||
 | 
						complex_t angle_step;
 | 
				
			||||||
 | 
						complex_t current_angle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Twiddle factors to turn IFFT into IMDCT */
 | 
				
			||||||
 | 
						for( i=0; i < 128; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							xcos1[i] = -cos(2.0f * M_PI * (8*i+1)/(8*N)) ; 
 | 
				
			||||||
 | 
							xsin1[i] = -sin(2.0f * M_PI * (8*i+1)/(8*N)) ;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* More twiddle factors to turn IFFT into IMDCT */
 | 
				
			||||||
 | 
						for( i=0; i < 64; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							xcos2[i] = -cos(2.0f * M_PI * (8*i+1)/(4*N)) ; 
 | 
				
			||||||
 | 
							xsin2[i] = -sin(2.0f * M_PI * (8*i+1)/(4*N)) ;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Canonical twiddle factors for FFT */
 | 
				
			||||||
 | 
						w[0] = w_1;
 | 
				
			||||||
 | 
						w[1] = w_2;
 | 
				
			||||||
 | 
						w[2] = w_4;
 | 
				
			||||||
 | 
						w[3] = w_8;
 | 
				
			||||||
 | 
						w[4] = w_16;
 | 
				
			||||||
 | 
						w[5] = w_32;
 | 
				
			||||||
 | 
						w[6] = w_64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for( i = 0; i < 7; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							angle_step.real = cos(-2.0 * M_PI / (1 << (i+1)));
 | 
				
			||||||
 | 
							angle_step.imag = sin(-2.0 * M_PI / (1 << (i+1)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							current_angle.real = 1.0;
 | 
				
			||||||
 | 
							current_angle.imag = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (k = 0; k < 1 << i; k++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								w[i][k] = current_angle;
 | 
				
			||||||
 | 
								current_angle = cmplx_mult(current_angle,angle_step);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					imdct_do_512(float data[],float delay[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i,k;
 | 
				
			||||||
 | 
						int p,q;
 | 
				
			||||||
 | 
						int m;
 | 
				
			||||||
 | 
						int two_m;
 | 
				
			||||||
 | 
						int two_m_plus_one;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						float tmp_a_i;
 | 
				
			||||||
 | 
						float tmp_a_r;
 | 
				
			||||||
 | 
						float tmp_b_i;
 | 
				
			||||||
 | 
						float tmp_b_r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						float *data_ptr;
 | 
				
			||||||
 | 
						float *delay_ptr;
 | 
				
			||||||
 | 
						float *window_ptr;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// 512 IMDCT with source and dest data in 'data'
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Pre IFFT complex multiply plus IFFT cmplx conjugate 
 | 
				
			||||||
 | 
						for( i=0; i < 128; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* z[i] = (X[256-2*i-1] + j * X[2*i]) * (xcos1[i] + j * xsin1[i]) ; */ 
 | 
				
			||||||
 | 
							buf[i].real =         (data[256-2*i-1] * xcos1[i])  -  (data[2*i]       * xsin1[i]);
 | 
				
			||||||
 | 
						  buf[i].imag = -1.0 * ((data[2*i]       * xcos1[i])  +  (data[256-2*i-1] * xsin1[i]));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Bit reversed shuffling
 | 
				
			||||||
 | 
						for(i=0; i<128; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							k = bit_reverse_512[i];
 | 
				
			||||||
 | 
							if (k < i)
 | 
				
			||||||
 | 
								swap_cmplx(&buf[i],&buf[k]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* FFT Merge */
 | 
				
			||||||
 | 
						for (m=0; m < 7; m++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(m)
 | 
				
			||||||
 | 
								two_m = (1 << m);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								two_m = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							two_m_plus_one = (1 << (m+1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(k = 0; k < two_m; k++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								for(i = 0; i < 128; i += two_m_plus_one)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									p = k + i;
 | 
				
			||||||
 | 
									q = p + two_m;
 | 
				
			||||||
 | 
									tmp_a_r = buf[p].real;
 | 
				
			||||||
 | 
									tmp_a_i = buf[p].imag;
 | 
				
			||||||
 | 
									tmp_b_r = buf[q].real * w[m][k].real - buf[q].imag * w[m][k].imag;
 | 
				
			||||||
 | 
									tmp_b_i = buf[q].imag * w[m][k].real + buf[q].real * w[m][k].imag;
 | 
				
			||||||
 | 
									buf[p].real = tmp_a_r + tmp_b_r;
 | 
				
			||||||
 | 
									buf[p].imag =  tmp_a_i + tmp_b_i;
 | 
				
			||||||
 | 
									buf[q].real = tmp_a_r - tmp_b_r;
 | 
				
			||||||
 | 
									buf[q].imag =  tmp_a_i - tmp_b_i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Post IFFT complex multiply  plus IFFT complex conjugate*/
 | 
				
			||||||
 | 
						for( i=0; i < 128; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */
 | 
				
			||||||
 | 
							tmp_a_r =        buf[i].real;
 | 
				
			||||||
 | 
							tmp_a_i = -1.0 * buf[i].imag;
 | 
				
			||||||
 | 
							buf[i].real =(tmp_a_r * xcos1[i])  -  (tmp_a_i  * xsin1[i]);
 | 
				
			||||||
 | 
						  buf[i].imag =(tmp_a_r * xsin1[i])  +  (tmp_a_i  * xcos1[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						data_ptr = data;
 | 
				
			||||||
 | 
						delay_ptr = delay;
 | 
				
			||||||
 | 
						window_ptr = window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Window and convert to real valued signal */
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							*data_ptr++   = 2.0f * (-buf[64+i].imag   * *window_ptr++ + *delay_ptr++); 
 | 
				
			||||||
 | 
							*data_ptr++   = 2.0f * ( buf[64-i-1].real * *window_ptr++ + *delay_ptr++); 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							*data_ptr++  = 2.0f * (-buf[i].real       * *window_ptr++ + *delay_ptr++); 
 | 
				
			||||||
 | 
							*data_ptr++  = 2.0f * ( buf[128-i-1].imag * *window_ptr++ + *delay_ptr++); 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* The trailing edge of the window goes into the delay line */
 | 
				
			||||||
 | 
						delay_ptr = delay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							*delay_ptr++  = -buf[64+i].real   * *--window_ptr; 
 | 
				
			||||||
 | 
							*delay_ptr++  =  buf[64-i-1].imag * *--window_ptr; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i<64; i++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*delay_ptr++  =  buf[i].imag       * *--window_ptr; 
 | 
				
			||||||
 | 
							*delay_ptr++  = -buf[128-i-1].real * *--window_ptr; 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					imdct_do_256(float data[],float delay[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i,k;
 | 
				
			||||||
 | 
						int p,q;
 | 
				
			||||||
 | 
						int m;
 | 
				
			||||||
 | 
						int two_m;
 | 
				
			||||||
 | 
						int two_m_plus_one;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						float tmp_a_i;
 | 
				
			||||||
 | 
						float tmp_a_r;
 | 
				
			||||||
 | 
						float tmp_b_i;
 | 
				
			||||||
 | 
						float tmp_b_r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						float *data_ptr;
 | 
				
			||||||
 | 
						float *delay_ptr;
 | 
				
			||||||
 | 
						float *window_ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						complex_t *buf_1, *buf_2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf_1 = &buf[0];
 | 
				
			||||||
 | 
						buf_2 = &buf[64];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Pre IFFT complex multiply plus IFFT cmplx conjugate */
 | 
				
			||||||
 | 
						for(k=0; k<64; k++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							/* X1[k] = X[2*k]  */
 | 
				
			||||||
 | 
							/* X2[k] = X[2*k+1]     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							p = 2 * (128-2*k-1);
 | 
				
			||||||
 | 
							q = 2 * (2 * k);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Z1[k] = (X1[128-2*k-1] + j * X1[2*k]) * (xcos2[k] + j * xsin2[k]); */ 
 | 
				
			||||||
 | 
							buf_1[k].real =         data[p] * xcos2[k] - data[q] * xsin2[k];
 | 
				
			||||||
 | 
						  buf_1[k].imag = -1.0f * (data[q] * xcos2[k] + data[p] * xsin2[k]); 
 | 
				
			||||||
 | 
							/* Z2[k] = (X2[128-2*k-1] + j * X2[2*k]) * (xcos2[k] + j * xsin2[k]); */ 
 | 
				
			||||||
 | 
							buf_2[k].real =          data[p + 1] * xcos2[k] - data[q + 1] * xsin2[k];
 | 
				
			||||||
 | 
						  buf_2[k].imag = -1.0f * ( data[q + 1] * xcos2[k] + data[p + 1] * xsin2[k]); 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//IFFT Bit reversed shuffling
 | 
				
			||||||
 | 
						for(i=0; i<64; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							k = bit_reverse_256[i];
 | 
				
			||||||
 | 
							if (k < i)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								swap_cmplx(&buf_1[i],&buf_1[k]);
 | 
				
			||||||
 | 
								swap_cmplx(&buf_2[i],&buf_2[k]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* FFT Merge */
 | 
				
			||||||
 | 
						for (m=0; m < 6; m++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							two_m = (1 << m);
 | 
				
			||||||
 | 
							two_m_plus_one = (1 << (m+1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//FIXME
 | 
				
			||||||
 | 
							if(m)
 | 
				
			||||||
 | 
								two_m = (1 << m);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								two_m = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(k = 0; k < two_m; k++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								for(i = 0; i < 64; i += two_m_plus_one)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									p = k + i;
 | 
				
			||||||
 | 
									q = p + two_m;
 | 
				
			||||||
 | 
									//Do block 1
 | 
				
			||||||
 | 
									tmp_a_r = buf_1[p].real;
 | 
				
			||||||
 | 
									tmp_a_i = buf_1[p].imag;
 | 
				
			||||||
 | 
									tmp_b_r = buf_1[q].real * w[m][k].real - buf_1[q].imag * w[m][k].imag;
 | 
				
			||||||
 | 
									tmp_b_i = buf_1[q].imag * w[m][k].real + buf_1[q].real * w[m][k].imag;
 | 
				
			||||||
 | 
									buf_1[p].real = tmp_a_r + tmp_b_r;
 | 
				
			||||||
 | 
									buf_1[p].imag =  tmp_a_i + tmp_b_i;
 | 
				
			||||||
 | 
									buf_1[q].real = tmp_a_r - tmp_b_r;
 | 
				
			||||||
 | 
									buf_1[q].imag =  tmp_a_i - tmp_b_i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									//Do block 2
 | 
				
			||||||
 | 
									tmp_a_r = buf_2[p].real;
 | 
				
			||||||
 | 
									tmp_a_i = buf_2[p].imag;
 | 
				
			||||||
 | 
									tmp_b_r = buf_2[q].real * w[m][k].real - buf_2[q].imag * w[m][k].imag;
 | 
				
			||||||
 | 
									tmp_b_i = buf_2[q].imag * w[m][k].real + buf_2[q].real * w[m][k].imag;
 | 
				
			||||||
 | 
									buf_2[p].real = tmp_a_r + tmp_b_r;
 | 
				
			||||||
 | 
									buf_2[p].imag =  tmp_a_i + tmp_b_i;
 | 
				
			||||||
 | 
									buf_2[q].real = tmp_a_r - tmp_b_r;
 | 
				
			||||||
 | 
									buf_2[q].imag =  tmp_a_i - tmp_b_i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Post IFFT complex multiply */
 | 
				
			||||||
 | 
						for( i=0; i < 64; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ 
 | 
				
			||||||
 | 
							tmp_a_r =  buf_1[i].real;
 | 
				
			||||||
 | 
							tmp_a_i = -buf_1[i].imag;
 | 
				
			||||||
 | 
							buf_1[i].real =(tmp_a_r * xcos2[i])  -  (tmp_a_i  * xsin2[i]);
 | 
				
			||||||
 | 
						  buf_1[i].imag =(tmp_a_r * xsin2[i])  +  (tmp_a_i  * xcos2[i]);
 | 
				
			||||||
 | 
							/* y2[n] = z2[n] * (xcos2[n] + j * xsin2[n]) ; */ 
 | 
				
			||||||
 | 
							tmp_a_r =  buf_2[i].real;
 | 
				
			||||||
 | 
							tmp_a_i = -buf_2[i].imag;
 | 
				
			||||||
 | 
							buf_2[i].real =(tmp_a_r * xcos2[i])  -  (tmp_a_i  * xsin2[i]);
 | 
				
			||||||
 | 
						  buf_2[i].imag =(tmp_a_r * xsin2[i])  +  (tmp_a_i  * xcos2[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						data_ptr = data;
 | 
				
			||||||
 | 
						delay_ptr = delay;
 | 
				
			||||||
 | 
						window_ptr = window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Window and convert to real valued signal */
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							*data_ptr++  = 2.0f * (-buf_1[i].imag      * *window_ptr++ + *delay_ptr++);
 | 
				
			||||||
 | 
							*data_ptr++  = 2.0f * ( buf_1[64-i-1].real * *window_ptr++ + *delay_ptr++);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*data_ptr++  = 2.0f * (-buf_1[i].real      * *window_ptr++ + *delay_ptr++);
 | 
				
			||||||
 | 
							*data_ptr++  = 2.0f * ( buf_1[64-i-1].imag * *window_ptr++ + *delay_ptr++);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						delay_ptr = delay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*delay_ptr++ = -buf_2[i].real      * *--window_ptr;
 | 
				
			||||||
 | 
							*delay_ptr++ =  buf_2[64-i-1].imag * *--window_ptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i< 64; i++) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*delay_ptr++ =  buf_2[i].imag      * *--window_ptr;
 | 
				
			||||||
 | 
							*delay_ptr++ = -buf_2[64-i-1].real * *--window_ptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//FIXME remove - for timing code
 | 
				
			||||||
 | 
					///#include <sys/time.h>
 | 
				
			||||||
 | 
					//FIXME remove
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void 
 | 
				
			||||||
 | 
					imdct(bsi_t *bsi,audblk_t *audblk, stream_samples_t samples) {
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//handy timing code
 | 
				
			||||||
 | 
						//struct timeval start,end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//gettimeofday(&start,0);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for(i=0; i<bsi->nfchans;i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(audblk->blksw[i])
 | 
				
			||||||
 | 
								imdct_do_256(samples[i],delay[i]);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								imdct_do_512(samples[i],delay[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						//gettimeofday(&end,0);
 | 
				
			||||||
 | 
						//printf("imdct %ld us\n",(end.tv_sec - start.tv_sec) * 1000000 +
 | 
				
			||||||
 | 
					        //end.tv_usec - start.tv_usec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//XXX We don't bother with the IMDCT for the LFE as it's currently
 | 
				
			||||||
 | 
						//unused.
 | 
				
			||||||
 | 
						//if (bsi->lfeon)
 | 
				
			||||||
 | 
						//	imdct_do_512(coeffs->lfe,samples->channel[5],delay[5]);
 | 
				
			||||||
 | 
						//	
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								ac3dec/libac3/imdct.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ac3dec/libac3/imdct.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,26 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  imdct.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void imdct(bsi_t *bsi,audblk_t *audblk, stream_samples_t samples);
 | 
				
			||||||
 | 
					void imdct_init(void);
 | 
				
			||||||
							
								
								
									
										656
									
								
								ac3dec/libac3/parse.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										656
									
								
								ac3dec/libac3/parse.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,656 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    parse.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "bitstream.h"
 | 
				
			||||||
 | 
					#include "stats.h"
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					#include "crc.h"
 | 
				
			||||||
 | 
					#include "parse.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Misc LUT */
 | 
				
			||||||
 | 
					static const uint_16 nfchans[8] = {2,1,2,3,3,4,4,5};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct frmsize_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_16 bit_rate;
 | 
				
			||||||
 | 
						uint_16 frm_size[3];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct frmsize_s frmsizecod_tbl[64] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						{ 32  ,{64   ,69   ,96   } },
 | 
				
			||||||
 | 
						{ 32  ,{64   ,70   ,96   } },
 | 
				
			||||||
 | 
						{ 40  ,{80   ,87   ,120  } },
 | 
				
			||||||
 | 
						{ 40  ,{80   ,88   ,120  } },
 | 
				
			||||||
 | 
						{ 48  ,{96   ,104  ,144  } },
 | 
				
			||||||
 | 
						{ 48  ,{96   ,105  ,144  } },
 | 
				
			||||||
 | 
						{ 56  ,{112  ,121  ,168  } },
 | 
				
			||||||
 | 
						{ 56  ,{112  ,122  ,168  } },
 | 
				
			||||||
 | 
						{ 64  ,{128  ,139  ,192  } },
 | 
				
			||||||
 | 
						{ 64  ,{128  ,140  ,192  } },
 | 
				
			||||||
 | 
						{ 80  ,{160  ,174  ,240  } },
 | 
				
			||||||
 | 
						{ 80  ,{160  ,175  ,240  } },
 | 
				
			||||||
 | 
						{ 96  ,{192  ,208  ,288  } },
 | 
				
			||||||
 | 
						{ 96  ,{192  ,209  ,288  } },
 | 
				
			||||||
 | 
						{ 112 ,{224  ,243  ,336  } },
 | 
				
			||||||
 | 
						{ 112 ,{224  ,244  ,336  } },
 | 
				
			||||||
 | 
						{ 128 ,{256  ,278  ,384  } },
 | 
				
			||||||
 | 
						{ 128 ,{256  ,279  ,384  } },
 | 
				
			||||||
 | 
						{ 160 ,{320  ,348  ,480  } },
 | 
				
			||||||
 | 
						{ 160 ,{320  ,349  ,480  } },
 | 
				
			||||||
 | 
						{ 192 ,{384  ,417  ,576  } },
 | 
				
			||||||
 | 
						{ 192 ,{384  ,418  ,576  } },
 | 
				
			||||||
 | 
						{ 224 ,{448  ,487  ,672  } },
 | 
				
			||||||
 | 
						{ 224 ,{448  ,488  ,672  } },
 | 
				
			||||||
 | 
						{ 256 ,{512  ,557  ,768  } },
 | 
				
			||||||
 | 
						{ 256 ,{512  ,558  ,768  } },
 | 
				
			||||||
 | 
						{ 320 ,{640  ,696  ,960  } },
 | 
				
			||||||
 | 
						{ 320 ,{640  ,697  ,960  } },
 | 
				
			||||||
 | 
						{ 384 ,{768  ,835  ,1152 } },
 | 
				
			||||||
 | 
						{ 384 ,{768  ,836  ,1152 } },
 | 
				
			||||||
 | 
						{ 448 ,{896  ,975  ,1344 } },
 | 
				
			||||||
 | 
						{ 448 ,{896  ,976  ,1344 } },
 | 
				
			||||||
 | 
						{ 512 ,{1024 ,1114 ,1536 } },
 | 
				
			||||||
 | 
						{ 512 ,{1024 ,1115 ,1536 } },
 | 
				
			||||||
 | 
						{ 576 ,{1152 ,1253 ,1728 } },
 | 
				
			||||||
 | 
						{ 576 ,{1152 ,1254 ,1728 } },
 | 
				
			||||||
 | 
						{ 640 ,{1280 ,1393 ,1920 } },
 | 
				
			||||||
 | 
						{ 640 ,{1280 ,1394 ,1920 } }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					parse_syncinfo_data(syncinfo_t *syncinfo, uint_8 *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Get the sampling rate 
 | 
				
			||||||
 | 
						syncinfo->fscod  = (data[2] >> 6) & 0x3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(syncinfo->fscod == 3)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//invalid sampling rate code
 | 
				
			||||||
 | 
							error_flag = 1;	
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if(syncinfo->fscod == 2)
 | 
				
			||||||
 | 
							syncinfo->sampling_rate = 32000;
 | 
				
			||||||
 | 
						else if(syncinfo->fscod == 1)
 | 
				
			||||||
 | 
							syncinfo->sampling_rate = 44100;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							syncinfo->sampling_rate = 48000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get the frame size code 
 | 
				
			||||||
 | 
						syncinfo->frmsizecod = data[2] & 0x3f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Calculate the frame size and bitrate
 | 
				
			||||||
 | 
						syncinfo->frame_size = 
 | 
				
			||||||
 | 
							frmsizecod_tbl[syncinfo->frmsizecod].frm_size[syncinfo->fscod];
 | 
				
			||||||
 | 
						syncinfo->bit_rate = frmsizecod_tbl[syncinfo->frmsizecod].bit_rate;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Parse a syncinfo structure, minus the sync word */
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					parse_syncinfo(syncinfo_t *syncinfo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int byte, idx;
 | 
				
			||||||
 | 
						uint_8 data[3];
 | 
				
			||||||
 | 
						uint_16 sync_word = 0;
 | 
				
			||||||
 | 
						uint_32 time_out = 1<<16;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 
 | 
				
			||||||
 | 
						// Find a ac3 sync frame. Time out if we read 64k without finding
 | 
				
			||||||
 | 
						// one.
 | 
				
			||||||
 | 
						// 
 | 
				
			||||||
 | 
						while(time_out--)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							byte = bitstream_get_byte();
 | 
				
			||||||
 | 
							if (byte < 0)
 | 
				
			||||||
 | 
								return -ENOENT;
 | 
				
			||||||
 | 
							sync_word = (sync_word << 8) + byte;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(sync_word == 0x0b77)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// We need to read in the entire syncinfo struct (0x0b77 + 24 bits)
 | 
				
			||||||
 | 
						// in order to determine how big the frame is
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						for (idx = 0; idx < 3; idx++) {
 | 
				
			||||||
 | 
							byte = bitstream_get_byte();
 | 
				
			||||||
 | 
							if (byte < 0)
 | 
				
			||||||
 | 
								return -ENOENT;
 | 
				
			||||||
 | 
							data[idx] = byte;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						parse_syncinfo_data(syncinfo, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Buffer the entire syncframe 
 | 
				
			||||||
 | 
						if (bitstream_buffer_frame(syncinfo->frame_size * 2 - 5) < 0)
 | 
				
			||||||
 | 
							return -ENOENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check the crc over the entire frame 
 | 
				
			||||||
 | 
						crc_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						crc_process_byte(data[0]);
 | 
				
			||||||
 | 
						crc_process_byte(data[1]);
 | 
				
			||||||
 | 
						crc_process_byte(data[2]);
 | 
				
			||||||
 | 
						crc_process_frame(bitstream_get_buffer_start(),syncinfo->frame_size * 2 - 5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!crc_validate())
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
							fprintf(stderr,"** CRC failed - skipping frame **\n");
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(ac3_config.flags & AC3_QUIET))
 | 
				
			||||||
 | 
							stats_print_syncinfo(syncinfo);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * This routine fills a bsi struct from the AC3 stream
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					parse_bsi(bsi_t *bsi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Check the AC-3 version number */
 | 
				
			||||||
 | 
						bsi->bsid = bitstream_get(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the audio service provided by the steram */
 | 
				
			||||||
 | 
						bsi->bsmod = bitstream_get(3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the audio coding mode (ie how many channels)*/
 | 
				
			||||||
 | 
						bsi->acmod = bitstream_get(3);
 | 
				
			||||||
 | 
						/* Predecode the number of full bandwidth channels as we use this
 | 
				
			||||||
 | 
						 * number a lot */
 | 
				
			||||||
 | 
						bsi->nfchans = nfchans[bsi->acmod];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If it is in use, get the centre channel mix level */
 | 
				
			||||||
 | 
						if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1))
 | 
				
			||||||
 | 
							bsi->cmixlev = bitstream_get(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If it is in use, get the surround channel mix level */
 | 
				
			||||||
 | 
						if (bsi->acmod & 0x4)
 | 
				
			||||||
 | 
							bsi->surmixlev = bitstream_get(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the dolby surround mode if in 2/0 mode */
 | 
				
			||||||
 | 
						if(bsi->acmod == 0x2)
 | 
				
			||||||
 | 
							bsi->dsurmod= bitstream_get(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Is the low frequency effects channel on? */
 | 
				
			||||||
 | 
						bsi->lfeon = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the dialogue normalization level */
 | 
				
			||||||
 | 
						bsi->dialnorm = bitstream_get(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does compression gain exist? */
 | 
				
			||||||
 | 
						bsi->compre = bitstream_get(1);
 | 
				
			||||||
 | 
						if (bsi->compre)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get compression gain */
 | 
				
			||||||
 | 
							bsi->compr = bitstream_get(8);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does language code exist? */
 | 
				
			||||||
 | 
						bsi->langcode = bitstream_get(1);
 | 
				
			||||||
 | 
						if (bsi->langcode)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get langauge code */
 | 
				
			||||||
 | 
							bsi->langcod = bitstream_get(8);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does audio production info exist? */
 | 
				
			||||||
 | 
						bsi->audprodie = bitstream_get(1);
 | 
				
			||||||
 | 
						if (bsi->audprodie)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get mix level */
 | 
				
			||||||
 | 
							bsi->mixlevel = bitstream_get(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Get room type */
 | 
				
			||||||
 | 
							bsi->roomtyp = bitstream_get(2);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If we're in dual mono mode then get some extra info */
 | 
				
			||||||
 | 
						if (bsi->acmod ==0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get the dialogue normalization level two */
 | 
				
			||||||
 | 
							bsi->dialnorm2 = bitstream_get(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Does compression gain two exist? */
 | 
				
			||||||
 | 
							bsi->compr2e = bitstream_get(1);
 | 
				
			||||||
 | 
							if (bsi->compr2e)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/* Get compression gain two */
 | 
				
			||||||
 | 
								bsi->compr2 = bitstream_get(8);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Does language code two exist? */
 | 
				
			||||||
 | 
							bsi->langcod2e = bitstream_get(1);
 | 
				
			||||||
 | 
							if (bsi->langcod2e)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/* Get langauge code two */
 | 
				
			||||||
 | 
								bsi->langcod2 = bitstream_get(8);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Does audio production info two exist? */
 | 
				
			||||||
 | 
							bsi->audprodi2e = bitstream_get(1);
 | 
				
			||||||
 | 
							if (bsi->audprodi2e)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/* Get mix level two */
 | 
				
			||||||
 | 
								bsi->mixlevel2 = bitstream_get(5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Get room type two */
 | 
				
			||||||
 | 
								bsi->roomtyp2 = bitstream_get(2);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the copyright bit */
 | 
				
			||||||
 | 
						bsi->copyrightb = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the original bit */
 | 
				
			||||||
 | 
						bsi->origbs = bitstream_get(1);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* Does timecode one exist? */
 | 
				
			||||||
 | 
						bsi->timecod1e = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(bsi->timecod1e)
 | 
				
			||||||
 | 
							bsi->timecod1 = bitstream_get(14);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does timecode two exist? */
 | 
				
			||||||
 | 
						bsi->timecod2e = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(bsi->timecod2e)
 | 
				
			||||||
 | 
							bsi->timecod2 = bitstream_get(14);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does addition info exist? */
 | 
				
			||||||
 | 
						bsi->addbsie = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(bsi->addbsie)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get how much info is there */
 | 
				
			||||||
 | 
							bsi->addbsil = bitstream_get(6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Get the additional info */
 | 
				
			||||||
 | 
							for(i=0;i<(bsi->addbsil + 1);i++)
 | 
				
			||||||
 | 
								bsi->addbsi[i] = bitstream_get(8);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(ac3_config.flags & AC3_QUIET))
 | 
				
			||||||
 | 
							stats_print_bsi(bsi);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* More pain inducing parsing */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					parse_audblk(bsi_t *bsi,audblk_t *audblk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i,j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i=0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Is this channel an interleaved 256 + 256 block ? */
 | 
				
			||||||
 | 
							audblk->blksw[i] = bitstream_get(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i=0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Should we dither this channel? */
 | 
				
			||||||
 | 
							audblk->dithflag[i] = bitstream_get(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does dynamic range control exist? */
 | 
				
			||||||
 | 
						audblk->dynrnge = bitstream_get(1);
 | 
				
			||||||
 | 
						if (audblk->dynrnge)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get dynamic range info */
 | 
				
			||||||
 | 
							audblk->dynrng = bitstream_get(8);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If we're in dual mono mode then get the second channel DR info */
 | 
				
			||||||
 | 
						if (bsi->acmod == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Does dynamic range control two exist? */
 | 
				
			||||||
 | 
							audblk->dynrng2e = bitstream_get(1);
 | 
				
			||||||
 | 
							if (audblk->dynrng2e)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/* Get dynamic range info */
 | 
				
			||||||
 | 
								audblk->dynrng2 = bitstream_get(8);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Does coupling strategy exist? */
 | 
				
			||||||
 | 
						audblk->cplstre = bitstream_get(1);
 | 
				
			||||||
 | 
						if (audblk->cplstre)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Is coupling turned on? */
 | 
				
			||||||
 | 
							audblk->cplinu = bitstream_get(1);
 | 
				
			||||||
 | 
							if(audblk->cplinu)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								for(i=0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
									audblk->chincpl[i] = bitstream_get(1);
 | 
				
			||||||
 | 
								if(bsi->acmod == 0x2)
 | 
				
			||||||
 | 
									audblk->phsflginu = bitstream_get(1);
 | 
				
			||||||
 | 
								audblk->cplbegf = bitstream_get(4);
 | 
				
			||||||
 | 
								audblk->cplendf = bitstream_get(4);
 | 
				
			||||||
 | 
								audblk->ncplsubnd = (audblk->cplendf + 2) - audblk->cplbegf + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Calculate the start and end bins of the coupling channel */
 | 
				
			||||||
 | 
								audblk->cplstrtmant = (audblk->cplbegf * 12) + 37 ; 
 | 
				
			||||||
 | 
								audblk->cplendmant =  ((audblk->cplendf + 3) * 12) + 37;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* The number of combined subbands is ncplsubnd minus each combined
 | 
				
			||||||
 | 
								 * band */
 | 
				
			||||||
 | 
								audblk->ncplbnd = audblk->ncplsubnd; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for(i=1; i< audblk->ncplsubnd; i++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									audblk->cplbndstrc[i] = bitstream_get(1);
 | 
				
			||||||
 | 
									audblk->ncplbnd -= audblk->cplbndstrc[i];
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->cplinu)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Loop through all the channels and get their coupling co-ords */	
 | 
				
			||||||
 | 
							for(i=0;i < bsi->nfchans;i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if(!audblk->chincpl[i])
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Is there new coupling co-ordinate info? */
 | 
				
			||||||
 | 
								audblk->cplcoe[i] = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(audblk->cplcoe[i])
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									audblk->mstrcplco[i] = bitstream_get(2); 
 | 
				
			||||||
 | 
									for(j=0;j < audblk->ncplbnd; j++)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										audblk->cplcoexp[i][j] = bitstream_get(4); 
 | 
				
			||||||
 | 
										audblk->cplcomant[i][j] = bitstream_get(4); 
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* If we're in dual mono mode, there's going to be some phase info */
 | 
				
			||||||
 | 
							if( (bsi->acmod == 0x2) && audblk->phsflginu && 
 | 
				
			||||||
 | 
									(audblk->cplcoe[0] || audblk->cplcoe[1]))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								for(j=0;j < audblk->ncplbnd; j++)
 | 
				
			||||||
 | 
									audblk->phsflg[j] = bitstream_get(1); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If we're in dual mono mode, there may be a rematrix strategy */
 | 
				
			||||||
 | 
						if(bsi->acmod == 0x2)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							audblk->rematstr = bitstream_get(1);
 | 
				
			||||||
 | 
							if(audblk->rematstr)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (audblk->cplinu == 0) 
 | 
				
			||||||
 | 
								{ 
 | 
				
			||||||
 | 
									for(i = 0; i < 4; i++) 
 | 
				
			||||||
 | 
										audblk->rematflg[i] = bitstream_get(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if((audblk->cplbegf > 2) && audblk->cplinu) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									for(i = 0; i < 4; i++) 
 | 
				
			||||||
 | 
										audblk->rematflg[i] = bitstream_get(1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if((audblk->cplbegf <= 2) && audblk->cplinu) 
 | 
				
			||||||
 | 
								{ 
 | 
				
			||||||
 | 
									for(i = 0; i < 3; i++) 
 | 
				
			||||||
 | 
										audblk->rematflg[i] = bitstream_get(1);
 | 
				
			||||||
 | 
								} 
 | 
				
			||||||
 | 
								if((audblk->cplbegf == 0) && audblk->cplinu) 
 | 
				
			||||||
 | 
									for(i = 0; i < 2; i++) 
 | 
				
			||||||
 | 
										audblk->rematflg[i] = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (audblk->cplinu)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Get the coupling channel exponent strategy */
 | 
				
			||||||
 | 
							audblk->cplexpstr = bitstream_get(2);
 | 
				
			||||||
 | 
							audblk->ncplgrps = (audblk->cplendmant - audblk->cplstrtmant) / 
 | 
				
			||||||
 | 
									(3 << (audblk->cplexpstr-1));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i = 0; i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
							audblk->chexpstr[i] = bitstream_get(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the exponent strategy for lfe channel */
 | 
				
			||||||
 | 
						if(bsi->lfeon) 
 | 
				
			||||||
 | 
							audblk->lfeexpstr = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Determine the bandwidths of all the fbw channels */
 | 
				
			||||||
 | 
						for(i = 0; i < bsi->nfchans; i++) 
 | 
				
			||||||
 | 
						{ 
 | 
				
			||||||
 | 
							uint_16 grp_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(audblk->chexpstr[i] != EXP_REUSE) 
 | 
				
			||||||
 | 
							{ 
 | 
				
			||||||
 | 
								if (audblk->cplinu && audblk->chincpl[i]) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									audblk->endmant[i] = audblk->cplstrtmant;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									audblk->chbwcod[i] = bitstream_get(6); 
 | 
				
			||||||
 | 
									audblk->endmant[i] = ((audblk->chbwcod[i] + 12) * 3) + 37;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Calculate the number of exponent groups to fetch */
 | 
				
			||||||
 | 
								grp_size =  3 * (1 << (audblk->chexpstr[i] - 1));
 | 
				
			||||||
 | 
								audblk->nchgrps[i] = (audblk->endmant[i] - 1 + (grp_size - 3)) / grp_size;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the coupling exponents if they exist */
 | 
				
			||||||
 | 
						if(audblk->cplinu && (audblk->cplexpstr != EXP_REUSE))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							audblk->cplabsexp = bitstream_get(4);
 | 
				
			||||||
 | 
							for(i=0;i< audblk->ncplgrps;i++)
 | 
				
			||||||
 | 
								audblk->cplexps[i] = bitstream_get(7);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the fwb channel exponents */
 | 
				
			||||||
 | 
						for(i=0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(audblk->chexpstr[i] != EXP_REUSE)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								audblk->exps[i][0] = bitstream_get(4);			
 | 
				
			||||||
 | 
								for(j=1;j<=audblk->nchgrps[i];j++)
 | 
				
			||||||
 | 
									audblk->exps[i][j] = bitstream_get(7);
 | 
				
			||||||
 | 
								audblk->gainrng[i] = bitstream_get(2);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the lfe channel exponents */
 | 
				
			||||||
 | 
						if(bsi->lfeon && (audblk->lfeexpstr != EXP_REUSE))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							audblk->lfeexps[0] = bitstream_get(4);
 | 
				
			||||||
 | 
							audblk->lfeexps[1] = bitstream_get(7);
 | 
				
			||||||
 | 
							audblk->lfeexps[2] = bitstream_get(7);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the parametric bit allocation parameters */
 | 
				
			||||||
 | 
						audblk->baie = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->baie)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							audblk->sdcycod = bitstream_get(2);
 | 
				
			||||||
 | 
							audblk->fdcycod = bitstream_get(2);
 | 
				
			||||||
 | 
							audblk->sgaincod = bitstream_get(2);
 | 
				
			||||||
 | 
							audblk->dbpbcod = bitstream_get(2);
 | 
				
			||||||
 | 
							audblk->floorcod = bitstream_get(3);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get the SNR off set info if it exists */
 | 
				
			||||||
 | 
						audblk->snroffste = bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->snroffste)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							audblk->csnroffst = bitstream_get(6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(audblk->cplinu)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								audblk->cplfsnroffst = bitstream_get(4);
 | 
				
			||||||
 | 
								audblk->cplfgaincod = bitstream_get(3);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(i = 0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								audblk->fsnroffst[i] = bitstream_get(4);
 | 
				
			||||||
 | 
								audblk->fgaincod[i] = bitstream_get(3);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if(bsi->lfeon)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								audblk->lfefsnroffst = bitstream_get(4);
 | 
				
			||||||
 | 
								audblk->lfefgaincod = bitstream_get(3);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get coupling leakage info if it exists */
 | 
				
			||||||
 | 
						if(audblk->cplinu)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							audblk->cplleake = bitstream_get(1);	
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(audblk->cplleake)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								audblk->cplfleak = bitstream_get(3);
 | 
				
			||||||
 | 
								audblk->cplsleak = bitstream_get(3);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/* Get the delta bit alloaction info */
 | 
				
			||||||
 | 
						audblk->deltbaie = bitstream_get(1);	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(audblk->deltbaie)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(audblk->cplinu)
 | 
				
			||||||
 | 
								audblk->cpldeltbae = bitstream_get(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(i = 0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
								audblk->deltbae[i] = bitstream_get(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (audblk->cplinu && (audblk->cpldeltbae == DELTA_BIT_NEW))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								audblk->cpldeltnseg = bitstream_get(3);
 | 
				
			||||||
 | 
								for(i = 0;i < audblk->cpldeltnseg + 1; i++)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									audblk->cpldeltoffst[i] = bitstream_get(5);
 | 
				
			||||||
 | 
									audblk->cpldeltlen[i] = bitstream_get(4);
 | 
				
			||||||
 | 
									audblk->cpldeltba[i] = bitstream_get(3);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(i = 0;i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (audblk->deltbae[i] == DELTA_BIT_NEW)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									audblk->deltnseg[i] = bitstream_get(3);
 | 
				
			||||||
 | 
									for(j = 0; j < audblk->deltnseg[i] + 1; j++)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										audblk->deltoffst[i][j] = bitstream_get(5);
 | 
				
			||||||
 | 
										audblk->deltlen[i][j] = bitstream_get(4);
 | 
				
			||||||
 | 
										audblk->deltba[i][j] = bitstream_get(3);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Check to see if there's any dummy info to get */
 | 
				
			||||||
 | 
						if((audblk->skiple =  bitstream_get(1)))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							uint_16 skip_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							audblk->skipl = bitstream_get(9);
 | 
				
			||||||
 | 
							//XXX remove
 | 
				
			||||||
 | 
							//fprintf(stderr,"(parse) skipping %d bytes\n",audblk->skipl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for(i = 0; i < audblk->skipl ; i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								skip_data = bitstream_get(8);
 | 
				
			||||||
 | 
								//XXX remove
 | 
				
			||||||
 | 
								//fprintf(stderr,"skipped data %2x\n",skip_data);
 | 
				
			||||||
 | 
								//if(skip_data != 0)
 | 
				
			||||||
 | 
								//{	
 | 
				
			||||||
 | 
									//dprintf("(parse) Invalid skipped data %2x\n",skip_data);
 | 
				
			||||||
 | 
									//exit(1);
 | 
				
			||||||
 | 
								//}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(ac3_config.flags & AC3_QUIET))
 | 
				
			||||||
 | 
							stats_print_audblk(bsi,audblk);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					parse_auxdata(syncinfo_t *syncinfo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//FIXME keep this now that we don't really need it?
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						int skip_length;
 | 
				
			||||||
 | 
						uint_16 crc;
 | 
				
			||||||
 | 
						uint_16 auxdatae;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						skip_length = (syncinfo->frame_size * 16)  - bitstream_get_total_bits() - 17 - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//XXX remove
 | 
				
			||||||
 | 
						//dprintf("(auxdata) skipping %d auxbits\n",skip_length);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for(i=0; i <  skip_length; i++)
 | 
				
			||||||
 | 
							//printf("Skipped bit %i\n",(uint_16)bitstream_get(1));
 | 
				
			||||||
 | 
							bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//get the auxdata exists bit
 | 
				
			||||||
 | 
						auxdatae = bitstream_get(1);	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//XXX remove
 | 
				
			||||||
 | 
						//dprintf("auxdatae = %i\n",auxdatae);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Skip the CRC reserved bit
 | 
				
			||||||
 | 
						bitstream_get(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Get the crc
 | 
				
			||||||
 | 
						crc = bitstream_get(16);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										29
									
								
								ac3dec/libac3/parse.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								ac3dec/libac3/parse.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    parse.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void parse_syncinfo_data(syncinfo_t *syncinfo, uint_8 *data);
 | 
				
			||||||
 | 
					int parse_syncinfo(syncinfo_t *syncinfo);
 | 
				
			||||||
 | 
					void parse_audblk(bsi_t *bsi,audblk_t *audblk);
 | 
				
			||||||
 | 
					void parse_bsi(bsi_t *bsi);
 | 
				
			||||||
 | 
					void parse_auxdata(syncinfo_t *syncinfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										83
									
								
								ac3dec/libac3/rematrix.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								ac3dec/libac3/rematrix.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,83 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    rematrix.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - July 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "decode.h"
 | 
				
			||||||
 | 
					#include "rematrix.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct rematrix_band_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 start;
 | 
				
			||||||
 | 
						uint_32 end;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct rematrix_band_s rematrix_band[] = { {13,24}, {25,36}, {37 ,60}, {61,252}};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint_32 min(uint_32 a,uint_32 b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint_32
 | 
				
			||||||
 | 
					min(uint_32 a,uint_32 b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (a < b ? a : b);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This routine simply does stereo rematixing for the 2 channel 
 | 
				
			||||||
 | 
					 * stereo mode */
 | 
				
			||||||
 | 
					void rematrix(audblk_t *audblk, stream_samples_t samples)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 num_bands;
 | 
				
			||||||
 | 
						uint_32 start;
 | 
				
			||||||
 | 
						uint_32 end;
 | 
				
			||||||
 | 
						uint_32 i,j;
 | 
				
			||||||
 | 
						float left,right;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!audblk->cplinu || audblk->cplbegf > 2)
 | 
				
			||||||
 | 
							num_bands = 4;
 | 
				
			||||||
 | 
						else if (audblk->cplbegf > 0)
 | 
				
			||||||
 | 
							num_bands = 3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							num_bands = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0;i < num_bands; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(!audblk->rematflg[i])
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							start = rematrix_band[i].start;
 | 
				
			||||||
 | 
							end = min(rematrix_band[i].end ,12 * audblk->cplbegf + 36);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							for(j=start;j < end; j++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								left  = samples[0][j] + samples[1][j];
 | 
				
			||||||
 | 
								right = samples[0][j] - samples[1][j];
 | 
				
			||||||
 | 
								samples[0][j] = left;
 | 
				
			||||||
 | 
								samples[1][j] = right;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										25
									
								
								ac3dec/libac3/rematrix.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								ac3dec/libac3/rematrix.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *    rematrix.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - July 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rematrix(audblk_t *audblk, stream_samples_t samples);
 | 
				
			||||||
							
								
								
									
										131
									
								
								ac3dec/libac3/sanity_check.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								ac3dec/libac3/sanity_check.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,131 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  sanity_check.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					#include "sanity_check.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void 
 | 
				
			||||||
 | 
					sanity_check_init(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						syncinfo->magic = AC3_MAGIC_NUMBER;
 | 
				
			||||||
 | 
						bsi->magic = AC3_MAGIC_NUMBER;
 | 
				
			||||||
 | 
						audblk->magic1 = AC3_MAGIC_NUMBER;
 | 
				
			||||||
 | 
						audblk->magic2 = AC3_MAGIC_NUMBER;
 | 
				
			||||||
 | 
						audblk->magic3 = AC3_MAGIC_NUMBER;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void 
 | 
				
			||||||
 | 
					sanity_check(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(syncinfo->magic != AC3_MAGIC_NUMBER)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- syncinfo magic number **");
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(bsi->magic != AC3_MAGIC_NUMBER)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- bsi magic number **");
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->magic1 != AC3_MAGIC_NUMBER)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- audblk magic number 1 **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->magic2 != AC3_MAGIC_NUMBER)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- audblk magic number 2 **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(audblk->magic3 != AC3_MAGIC_NUMBER)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- audblk magic number 3 **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i = 0;i < 5 ; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (audblk->fbw_exp[i][255] !=0 || audblk->fbw_exp[i][254] !=0 || 
 | 
				
			||||||
 | 
									audblk->fbw_exp[i][253] !=0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								fprintf(stderr,"\n** Sanity check failed -- fbw_exp out of bounds **"); 
 | 
				
			||||||
 | 
								error_flag = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (audblk->fbw_bap[i][255] !=0 || audblk->fbw_bap[i][254] !=0 || 
 | 
				
			||||||
 | 
									audblk->fbw_bap[i][253] !=0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								fprintf(stderr,"\n** Sanity check failed -- fbw_bap out of bounds **"); 
 | 
				
			||||||
 | 
								error_flag = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (audblk->cpl_exp[255] !=0 || audblk->cpl_exp[254] !=0 || 
 | 
				
			||||||
 | 
								audblk->cpl_exp[253] !=0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- cpl_exp out of bounds **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (audblk->cpl_bap[255] !=0 || audblk->cpl_bap[254] !=0 || 
 | 
				
			||||||
 | 
								audblk->cpl_bap[253] !=0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- cpl_bap out of bounds **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (audblk->cplmant[255] !=0 || audblk->cplmant[254] !=0 || 
 | 
				
			||||||
 | 
								audblk->cplmant[253] !=0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- cpl_mant out of bounds **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((audblk->cplinu == 1) && (audblk->cplbegf > (audblk->cplendf+2)))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"\n** Sanity check failed -- cpl params inconsistent **"); 
 | 
				
			||||||
 | 
							error_flag = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0; i < bsi->nfchans; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if((audblk->chincpl[i] == 0) && (audblk->chbwcod[i] > 60))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								fprintf(stderr,"\n** Sanity check failed -- chbwcod too big **"); 
 | 
				
			||||||
 | 
								error_flag = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}	
 | 
				
			||||||
							
								
								
									
										27
									
								
								ac3dec/libac3/sanity_check.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								ac3dec/libac3/sanity_check.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  sanity_check.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define AC3_MAGIC_NUMBER 0xdeadbeef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void sanity_check_init(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk);
 | 
				
			||||||
 | 
					void sanity_check(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk);
 | 
				
			||||||
							
								
								
									
										178
									
								
								ac3dec/libac3/stats.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								ac3dec/libac3/stats.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,178 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  stats.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "decode.h"
 | 
				
			||||||
 | 
					#include "stats.h"
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *service_ids[8] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						"CM","ME","VI","HI",
 | 
				
			||||||
 | 
						 "D", "C","E", "VO"
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct mixlev_s
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						float clev;
 | 
				
			||||||
 | 
						char *desc;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct mixlev_s cmixlev_tbl[4] =  
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						{0.707, "(-3.0 dB)"}, {0.595, "(-4.5 dB)"},
 | 
				
			||||||
 | 
						{0.500, "(-6.0 dB)"}, {1.0,  "Invalid"}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct mixlev_s smixlev_tbl[4] =  
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						{0.707, "(-3.0 dB)"}, {0.500, "(-6.0 dB)"},
 | 
				
			||||||
 | 
						{  0.0,   "off    "}, {  1.0, "Invalid"}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *language[128] = 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						"unknown", "Albanian", "Breton", "Catalan", "Croatian", "Welsh", "Czech", "Danish", 
 | 
				
			||||||
 | 
						"German", "English", "Spanish", "Esperanto", "Estonian", "Basque", "Faroese", "French", 
 | 
				
			||||||
 | 
						"Frisian", "Irish", "Gaelic", "Galician", "Icelandic", "Italian", "Lappish", "Latin", 
 | 
				
			||||||
 | 
						"Latvian", "Luxembourgian", "Lithuanian", "Hungarian", "Maltese", "Dutch", "Norwegian", "Occitan", 
 | 
				
			||||||
 | 
						"Polish", "Portugese", "Romanian", "Romansh", "Serbian", "Slovak", "Slovene", "Finnish", 
 | 
				
			||||||
 | 
						"Swedish", "Turkish", "Flemish", "Walloon", "0x2c", "0x2d", "0x2e", "0x2f", 
 | 
				
			||||||
 | 
						"0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", 
 | 
				
			||||||
 | 
						"0x38", "0x39", "0x3a", "0x3b", "0x3c", "0x3d", "0x3e", "0x3f", 
 | 
				
			||||||
 | 
						"background", "0x41", "0x42", "0x43", "0x44", "Zulu", "Vietnamese", "Uzbek", 
 | 
				
			||||||
 | 
						"Urdu", "Ukrainian", "Thai", "Telugu", "Tatar", "Tamil", "Tadzhik", "Swahili", 
 | 
				
			||||||
 | 
						"Sranan Tongo", "Somali", "Sinhalese", "Shona", "Serbo-Croat", "Ruthenian", "Russian", "Quechua", 
 | 
				
			||||||
 | 
						"Pustu", "Punjabi", "Persian", "Papamiento", "Oriya", "Nepali", "Ndebele", "Marathi", 
 | 
				
			||||||
 | 
						"Moldavian", "Malaysian", "Malagasay", "Macedonian", "Laotian", "Korean", "Khmer", "Kazakh",
 | 
				
			||||||
 | 
						"Kannada", "Japanese", "Indonesian", "Hindi", "Hebrew", "Hausa", "Gurani", "Gujurati", 
 | 
				
			||||||
 | 
						"Greek", "Georgian", "Fulani", "Dari", "Churash", "Chinese", "Burmese", "Bulgarian", 
 | 
				
			||||||
 | 
						"Bengali", "Belorussian", "Bambora", "Azerbijani", "Assamese", "Armenian", "Arabic", "Amharic"
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void stats_print_banner(syncinfo_t *syncinfo,bsi_t *bsi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// fprintf(stdout,PACKAGE"-"VERSION" (C) 2000 Aaron Holtzman (aholtzma@ess.engr.uvic.ca)\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fprintf(stdout,"%d.%d Mode ",bsi->nfchans,bsi->lfeon);
 | 
				
			||||||
 | 
						fprintf(stdout,"%2.1f KHz",syncinfo->sampling_rate * 1e-3);
 | 
				
			||||||
 | 
						fprintf(stdout,"%4d kbps ",syncinfo->bit_rate);
 | 
				
			||||||
 | 
						if (bsi->langcode && (bsi->langcod < 128))
 | 
				
			||||||
 | 
							fprintf(stdout,"%s ", language[bsi->langcod]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch(bsi->bsmod)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								fprintf(stdout,"Complete Main Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
								fprintf(stdout,"Music and Effects Audio Service");
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
								fprintf(stdout,"Visually Impaired Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 3:
 | 
				
			||||||
 | 
								fprintf(stdout,"Hearing Impaired Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 4:
 | 
				
			||||||
 | 
								fprintf(stdout,"Dialogue Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 5:
 | 
				
			||||||
 | 
								fprintf(stdout,"Commentary Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 6:
 | 
				
			||||||
 | 
								fprintf(stdout,"Emergency Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 7:
 | 
				
			||||||
 | 
								fprintf(stdout,"Voice Over Audio Service");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fprintf(stdout,"\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void stats_print_syncinfo(syncinfo_t *syncinfo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						dprintf("(syncinfo) ");
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						switch (syncinfo->fscod)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
								dprintf("32 KHz   ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
								dprintf("44.1 KHz ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								dprintf("48 KHz   ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								dprintf("Invalid sampling rate ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dprintf("%4d kbps %4d words per frame\n",syncinfo->bit_rate, 
 | 
				
			||||||
 | 
								syncinfo->frame_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					void stats_print_bsi(bsi_t *bsi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						dprintf("(bsi) ");
 | 
				
			||||||
 | 
						dprintf("%s",service_ids[bsi->bsmod]);
 | 
				
			||||||
 | 
						dprintf(" %d.%d Mode ",bsi->nfchans,bsi->lfeon);
 | 
				
			||||||
 | 
						if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1))
 | 
				
			||||||
 | 
							dprintf(" Centre Mix Level %s ",cmixlev_tbl[bsi->cmixlev].desc);
 | 
				
			||||||
 | 
						if (bsi->acmod & 0x4)
 | 
				
			||||||
 | 
							dprintf(" Sur Mix Level %s ",smixlev_tbl[bsi->cmixlev].desc);
 | 
				
			||||||
 | 
						dprintf("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *exp_strat_tbl[4] = {"R   ","D15 ","D25 ","D45 "};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void stats_print_audblk(bsi_t *bsi,audblk_t *audblk)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint_32 i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dprintf("(audblk) ");
 | 
				
			||||||
 | 
						dprintf("%s ",audblk->cplinu ? "cpl on " : "cpl off");
 | 
				
			||||||
 | 
						dprintf("%s ",audblk->baie? "bai " : "    ");
 | 
				
			||||||
 | 
						dprintf("%s ",audblk->snroffste? "snroffst " : "         ");
 | 
				
			||||||
 | 
						dprintf("%s ",audblk->deltbaie? "deltba " : "       ");
 | 
				
			||||||
 | 
						dprintf("%s ",audblk->phsflginu? "phsflg " : "       ");
 | 
				
			||||||
 | 
						dprintf("(%s %s %s %s %s) ",exp_strat_tbl[audblk->chexpstr[0]],
 | 
				
			||||||
 | 
							exp_strat_tbl[audblk->chexpstr[1]],exp_strat_tbl[audblk->chexpstr[2]],
 | 
				
			||||||
 | 
							exp_strat_tbl[audblk->chexpstr[3]],exp_strat_tbl[audblk->chexpstr[4]]);
 | 
				
			||||||
 | 
						dprintf("[");
 | 
				
			||||||
 | 
						for(i=0;i<bsi->nfchans;i++)
 | 
				
			||||||
 | 
							dprintf("%1d",audblk->blksw[i]);
 | 
				
			||||||
 | 
						dprintf("]");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dprintf("\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								ac3dec/libac3/stats.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								ac3dec/libac3/stats.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  stats.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void stats_print_syncinfo(syncinfo_t *syncinfo);
 | 
				
			||||||
 | 
					void stats_print_bsi(bsi_t *bsi);
 | 
				
			||||||
 | 
					void stats_print_audblk(bsi_t *bsi,audblk_t *audblk);
 | 
				
			||||||
 | 
					void stats_print_banner(syncinfo_t *syncinfo,bsi_t *bsi);
 | 
				
			||||||
							
								
								
									
										224
									
								
								ac3dec/output.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								ac3dec/output.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,224 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <alloca.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <alsa/asoundlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef signed short sint_16;
 | 
				
			||||||
 | 
					typedef unsigned int uint_32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "output.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static output_t out_config;
 | 
				
			||||||
 | 
					static snd_pcm_t *pcm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * open the audio device for writing to
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int output_open(output_t *output)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const char *pcm_name = output->pcm_name;
 | 
				
			||||||
 | 
						char devstr[128];
 | 
				
			||||||
 | 
						const char *basedev;
 | 
				
			||||||
 | 
						snd_pcm_hw_params_t *params;
 | 
				
			||||||
 | 
						unsigned int rate, buffer_time, period_time, tmp;
 | 
				
			||||||
 | 
						snd_pcm_format_t format = output->bits == 16 ? SND_PCM_FORMAT_S16 : SND_PCM_FORMAT_U8;
 | 
				
			||||||
 | 
						int err, step;
 | 
				
			||||||
 | 
						snd_pcm_hw_params_alloca(¶ms);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out_config = *output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Open the device driver
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (pcm_name == NULL) {
 | 
				
			||||||
 | 
							switch (output->channels) {
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
								if (output->spdif != SPDIF_NONE) {
 | 
				
			||||||
 | 
									unsigned char s[4];
 | 
				
			||||||
 | 
									if (output->spdif == SPDIF_PRO) {
 | 
				
			||||||
 | 
										s[0] = (IEC958_AES0_PROFESSIONAL |
 | 
				
			||||||
 | 
										        IEC958_AES0_NONAUDIO |
 | 
				
			||||||
 | 
											IEC958_AES0_PRO_EMPHASIS_NONE |
 | 
				
			||||||
 | 
											IEC958_AES0_PRO_FS_48000);
 | 
				
			||||||
 | 
										s[1] = (IEC958_AES1_PRO_MODE_NOTID |
 | 
				
			||||||
 | 
											IEC958_AES1_PRO_USERBITS_NOTID);
 | 
				
			||||||
 | 
										s[2] = IEC958_AES2_PRO_WORDLEN_NOTID;
 | 
				
			||||||
 | 
										s[3] = 0;
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										s[0] = IEC958_AES0_CON_EMPHASIS_NONE;
 | 
				
			||||||
 | 
										if (output->spdif == SPDIF_CON)
 | 
				
			||||||
 | 
											s[0] |= IEC958_AES0_NONAUDIO;
 | 
				
			||||||
 | 
										s[1] = (IEC958_AES1_CON_ORIGINAL |
 | 
				
			||||||
 | 
											IEC958_AES1_CON_PCM_CODER);
 | 
				
			||||||
 | 
										s[2] = 0;
 | 
				
			||||||
 | 
										s[3] = IEC958_AES3_CON_FS_48000;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (output->hdmi)
 | 
				
			||||||
 | 
										basedev = "hdmi";
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										basedev = "iec958";
 | 
				
			||||||
 | 
									sprintf(devstr, "plug:%s:{"
 | 
				
			||||||
 | 
										"AES0 0x%x AES1 0x%x "
 | 
				
			||||||
 | 
										"AES2 0x%x AES3 0x%x",
 | 
				
			||||||
 | 
										basedev,
 | 
				
			||||||
 | 
										s[0], s[1], s[2], s[3]);
 | 
				
			||||||
 | 
									if (out_config.card)
 | 
				
			||||||
 | 
										sprintf(devstr + strlen(devstr),
 | 
				
			||||||
 | 
											" CARD %s", out_config.card);
 | 
				
			||||||
 | 
									strcat(devstr, "}");
 | 
				
			||||||
 | 
									format = SND_PCM_FORMAT_S16_LE;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if (out_config.card)
 | 
				
			||||||
 | 
										sprintf(devstr, "plughw:%s", out_config.card);
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
										sprintf(devstr, "default");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 4:
 | 
				
			||||||
 | 
								strcpy(devstr, "plug:surround40");
 | 
				
			||||||
 | 
								if (out_config.card)
 | 
				
			||||||
 | 
									sprintf(devstr + strlen(devstr), ":{CARD %s}", out_config.card);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 6:
 | 
				
			||||||
 | 
								strcpy(devstr, "plug:surround51");
 | 
				
			||||||
 | 
								if (out_config.card)
 | 
				
			||||||
 | 
									sprintf(devstr + strlen(devstr), ":{CARD %s}", out_config.card);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								fprintf(stderr, "%d channels are not supported\n", output->channels);
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							pcm_name = devstr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!output->quiet)
 | 
				
			||||||
 | 
							fprintf(stdout, "Using PCM device '%s'\n", pcm_name);
 | 
				
			||||||
 | 
						if ((err = snd_pcm_open(&pcm, pcm_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "snd_pcm_open: %s\n", snd_strerror(err));
 | 
				
			||||||
 | 
							return err;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = snd_pcm_hw_params_any(pcm, params);
 | 
				
			||||||
 | 
						if (err < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Broken configuration for this PCM: no configurations available");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						/* set interleaved access */
 | 
				
			||||||
 | 
						err = snd_pcm_hw_params_set_access(pcm, params,
 | 
				
			||||||
 | 
										   SND_PCM_ACCESS_RW_INTERLEAVED);
 | 
				
			||||||
 | 
						if (err < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Access type not available\n");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = snd_pcm_hw_params_set_format(pcm, params, format);
 | 
				
			||||||
 | 
						if (err < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Sample format non available\n");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = snd_pcm_hw_params_set_channels(pcm, params, output->channels);
 | 
				
			||||||
 | 
						if (err < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Channels count non available\n");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						rate = output->rate;
 | 
				
			||||||
 | 
						err = snd_pcm_hw_params_set_rate_near(pcm, params, &rate, 0);
 | 
				
			||||||
 | 
						if (err < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Rate not available\n");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buffer_time = 500000;
 | 
				
			||||||
 | 
						err = snd_pcm_hw_params_set_buffer_time_near(pcm, params, &buffer_time, 0);
 | 
				
			||||||
 | 
						if (err < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Buffer time not available\n");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						step = 2;
 | 
				
			||||||
 | 
						period_time = 10000 * 2;
 | 
				
			||||||
 | 
						do {
 | 
				
			||||||
 | 
							period_time /= 2;
 | 
				
			||||||
 | 
							tmp = period_time;
 | 
				
			||||||
 | 
							err = snd_pcm_hw_params_set_period_time_near(pcm, params, &tmp, 0);
 | 
				
			||||||
 | 
							if (err < 0) {
 | 
				
			||||||
 | 
								fprintf(stderr, "Period time not available\n");
 | 
				
			||||||
 | 
								goto __close;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (tmp == period_time) {
 | 
				
			||||||
 | 
								period_time /= 3;
 | 
				
			||||||
 | 
								tmp = period_time;
 | 
				
			||||||
 | 
								err = snd_pcm_hw_params_set_period_time_near(pcm, params, &tmp, 0);
 | 
				
			||||||
 | 
								if (tmp == period_time)
 | 
				
			||||||
 | 
									period_time = 10000 * 2;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} while (buffer_time == period_time && period_time > 10000);
 | 
				
			||||||
 | 
						if (buffer_time == period_time) {
 | 
				
			||||||
 | 
							fprintf(stderr, "Buffer time and period time match, could not use\n");
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ((err = snd_pcm_hw_params(pcm, params)) < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "PCM hw_params failed: %s\n", snd_strerror(err));
 | 
				
			||||||
 | 
							goto __close;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					      __close:
 | 
				
			||||||
 | 
					      	snd_pcm_close(pcm);
 | 
				
			||||||
 | 
					      	pcm = NULL;
 | 
				
			||||||
 | 
					      	return err;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * play the sample to the already opened file descriptor
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int output_play(sint_16* output_samples, uint_32 num_frames)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						snd_pcm_sframes_t res = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do {
 | 
				
			||||||
 | 
							if (res == -EPIPE)		/* underrun */
 | 
				
			||||||
 | 
								res = snd_pcm_prepare(pcm);
 | 
				
			||||||
 | 
							else if (res == -ESTRPIPE) {	/* suspend */
 | 
				
			||||||
 | 
								while ((res = snd_pcm_resume(pcm)) == -EAGAIN)
 | 
				
			||||||
 | 
									sleep(1);
 | 
				
			||||||
 | 
								if (res < 0)
 | 
				
			||||||
 | 
									res = snd_pcm_prepare(pcm);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							res = res < 0 ? res : snd_pcm_writei(pcm, (void *)output_samples, num_frames);
 | 
				
			||||||
 | 
							if (res > 0) {
 | 
				
			||||||
 | 
								output_samples += out_config.channels * res;
 | 
				
			||||||
 | 
								num_frames -= res;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} while (res == -EPIPE || num_frames > 0);
 | 
				
			||||||
 | 
						if (res < 0)
 | 
				
			||||||
 | 
							fprintf(stderr, "writei returned error: %s\n", snd_strerror(res));
 | 
				
			||||||
 | 
						return res < 0 ? (int)res : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					output_close(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						snd_pcm_close(pcm);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								ac3dec/output.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								ac3dec/output.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  output.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Based on original code by Angus Mackay (amackay@gus.ml.org)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Copyright (C) Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						const char *pcm_name;
 | 
				
			||||||
 | 
						char *card;
 | 
				
			||||||
 | 
						int bits;
 | 
				
			||||||
 | 
						int rate;
 | 
				
			||||||
 | 
						int channels;
 | 
				
			||||||
 | 
						unsigned int quiet: 1;
 | 
				
			||||||
 | 
						unsigned int hdmi: 1;
 | 
				
			||||||
 | 
						enum {SPDIF_NONE = 0, SPDIF_CON, SPDIF_PRO, SPDIF_PCM} spdif;
 | 
				
			||||||
 | 
					} output_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int output_open(output_t *output);
 | 
				
			||||||
 | 
					int output_play(sint_16* output_samples, uint_32 num_bytes);
 | 
				
			||||||
 | 
					void output_close(void);
 | 
				
			||||||
							
								
								
									
										17
									
								
								ac3dec/plot_spectrum.m
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								ac3dec/plot_spectrum.m
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					window_size = 2048;
 | 
				
			||||||
 | 
					f = 0:48000/window_size:48000 * (1 - 1/window_size);
 | 
				
			||||||
 | 
					w = transpose(hamming(1536));
 | 
				
			||||||
 | 
					n = size(foo,1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					spectrum = zeros(1,window_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for i = [1:n] 
 | 
				
			||||||
 | 
						data = w .* foo(i,:);	
 | 
				
			||||||
 | 
						spectrum = spectrum + abs(fft(data,window_size));
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					plot(f,10*log10(spectrum/max(spectrum)));
 | 
				
			||||||
 | 
					grid;
 | 
				
			||||||
 | 
					axis([0 24000 -40 0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										37
									
								
								ac3dec/test/Makefile.am
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ac3dec/test/Makefile.am
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					INCLUDES = -I../libac3
 | 
				
			||||||
 | 
					noinst_PROGRAMS = imdct_test dither_test
 | 
				
			||||||
 | 
					#noinst_PROGRAMS = bitstream_test imdct_test imdct_timing uncouple_timing\
 | 
				
			||||||
 | 
						#crc_timing
 | 
				
			||||||
 | 
					noinst_HEADERS = timing.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#bitstream_test_SOURCES = bitstream_test.c
 | 
				
			||||||
 | 
					#bitstream_test_LDADD = ../bitstream.o ../crc.o
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					dither_test_SOURCES = dither_test.c
 | 
				
			||||||
 | 
					dither_test_LDADD = ../libac3/dither.o 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					imdct_test_SOURCES = imdct_test.c
 | 
				
			||||||
 | 
					imdct_test_LDADD = ../libac3/imdct.o -lm
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#imdct_timing_SOURCES = imdct_timing.c timing.c
 | 
				
			||||||
 | 
					#imdct_timing_LDADD = ../imdct.o -lm
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#uncouple_timing_SOURCES = uncouple_timing.c timing.c
 | 
				
			||||||
 | 
					#uncouple_timing_LDADD = ../uncouple.o ../dither.o -lm
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#crc_timing_SOURCES = crc_timing.c timing.c
 | 
				
			||||||
 | 
					#crc_timing_LDADD = ../crc.o -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check:
 | 
				
			||||||
 | 
					#	rm -f bitstream_test.out
 | 
				
			||||||
 | 
					#	./bitstream_test > bitstream_test.out
 | 
				
			||||||
 | 
					#	diff bitstream_test.out bitstream_test.out.ref
 | 
				
			||||||
 | 
					#	rm -f imdct_test.out
 | 
				
			||||||
 | 
					#	./imdct_test > imdct_test.out
 | 
				
			||||||
 | 
					#	diff imdct_test.out imdct_test.out.ref
 | 
				
			||||||
 | 
						rm -f dither_test.out
 | 
				
			||||||
 | 
						./dither_test > dither_test.out
 | 
				
			||||||
 | 
						diff dither_test.out dither_test.out.ref
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
						rm -f *.out
 | 
				
			||||||
							
								
								
									
										43
									
								
								ac3dec/test/dither_test.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ac3dec/test/dither_test.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  dither_test.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					#include "dither.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i,j,foo;
 | 
				
			||||||
 | 
						struct timeval start,end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						for(i=0;i < 65538 ;i++)
 | 
				
			||||||
 | 
							//printf("%04x\n",dither_gen());
 | 
				
			||||||
 | 
							printf("%f\n",((sint_16)dither_gen())/ 32768.0);
 | 
				
			||||||
 | 
						printf("\n");
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(j=0;j < 10 ;j++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							gettimeofday(&start,0);
 | 
				
			||||||
 | 
							for(i=0;i < 10000 ;i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								foo = dither_gen();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							gettimeofday(&end,0);
 | 
				
			||||||
 | 
							printf("%f us\n",((end.tv_sec - start.tv_sec) * 1000000 + 
 | 
				
			||||||
 | 
									(end.tv_usec - start.tv_usec))/10000.0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										38
									
								
								ac3dec/test/imdct_test.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								ac3dec/test/imdct_test.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  imdct_test.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ac3.h"
 | 
				
			||||||
 | 
					#include "ac3_internal.h"
 | 
				
			||||||
 | 
					#include "imdct.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static stream_samples_t samples;
 | 
				
			||||||
 | 
					static bsi_t bsi;
 | 
				
			||||||
 | 
					static audblk_t audblk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						samples[0][20] = 0.4;
 | 
				
			||||||
 | 
						samples[0][40] = 0.4;
 | 
				
			||||||
 | 
						samples[0][30] = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						imdct_init();
 | 
				
			||||||
 | 
						bsi.nfchans = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						imdct(&bsi,&audblk,samples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for(i=0;i<256;i++)
 | 
				
			||||||
 | 
							printf("%1.8f\n",samples[0][i]);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								ac3dec/test/timing.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								ac3dec/test/timing.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					/* 
 | 
				
			||||||
 | 
					 *  timing.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	Aaron Holtzman - May 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//uint_64 get_time(void);
 | 
				
			||||||
 | 
					uint_64 timing_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void timing_test_2(void (*func)(void*,void*),void *arg_1,void *arg_2,char name[]);
 | 
				
			||||||
 | 
					void timing_test_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3,char name[]);
 | 
				
			||||||
 | 
					double timing_once_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								ac3dec/tools/Makefile.am
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								ac3dec/tools/Makefile.am
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					# # Process this file with automake to produce Makefile.in.
 | 
				
			||||||
 | 
					AUTOMAKE_OPTIONS = 1.3 foreign
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CFLAGS = -Wall -O3 -g 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bin_PROGRAMS = extract_ac3 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extract_ac3_SOURCES = extract_ac3.c
 | 
				
			||||||
 | 
					#verify is broken right now
 | 
				
			||||||
 | 
					#verify_ac3_SOURCES = verify_ac3.c
 | 
				
			||||||
 | 
					#verify_ac3_LDADD = ../parse.o ../bitstream.o ../crc.o ../debug.o ../stats.o
 | 
				
			||||||
							
								
								
									
										314
									
								
								ac3dec/tools/extract_ac3.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								ac3dec/tools/extract_ac3.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,314 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *  extract_ac3.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Copyright (C) Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - June 1999
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Extracts an AC-3 audio stream from an MPEG-2 system stream
 | 
				
			||||||
 | 
					 *  and writes it to stdout
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Ideas and bitstream syntax info borrowed from code written 
 | 
				
			||||||
 | 
					 *  by Nathan Laredo <laredo@gnu.org>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Multiple track support by Yuqing Deng <deng@tinker.chem.brown.edu>
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
 | 
				
			||||||
 | 
					 *	
 | 
				
			||||||
 | 
					 *  ac3dec 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, or (at your option)
 | 
				
			||||||
 | 
					 *  any later version.
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *  ac3dec 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 GNU Make; see the file COPYING.  If not, write to
 | 
				
			||||||
 | 
					 *  the Free Software Foundation, 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Audio track to play */
 | 
				
			||||||
 | 
					static unsigned char track_code = 0x80;
 | 
				
			||||||
 | 
					static unsigned char track_table[8] = 
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
						0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BUFSIZE 512 /* needs to be as big as biggest header */
 | 
				
			||||||
 | 
					static int vobf;
 | 
				
			||||||
 | 
					static unsigned char buf[BUFSIZE];
 | 
				
			||||||
 | 
					static unsigned char *cur_pos;
 | 
				
			||||||
 | 
					static unsigned char *end_pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void file_init(char file_name[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(file_name[0] == '-' && file_name[1] == '\0')
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						   vobf = STDIN_FILENO;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if ((vobf = open(file_name, O_RDONLY)) < 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"File not found\n");
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cur_pos = buf;
 | 
				
			||||||
 | 
						end_pos = buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void increment_position(long x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(cur_pos + x <= end_pos)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						   cur_pos += x;
 | 
				
			||||||
 | 
						   if(cur_pos == end_pos)
 | 
				
			||||||
 | 
						   {
 | 
				
			||||||
 | 
							cur_pos = buf;
 | 
				
			||||||
 | 
					                end_pos = buf;
 | 
				
			||||||
 | 
						   }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					           long size = 0;
 | 
				
			||||||
 | 
					           x -= (long)(end_pos - cur_pos);
 | 
				
			||||||
 | 
					#ifdef SEEK_PIPES
 | 
				
			||||||
 | 
							if(lseek(vobf, x, SEEK_CUR) < 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							   fprintf(stderr, "Error: unexpected end of stream\n");
 | 
				
			||||||
 | 
							   exit(1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							while(x)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							   size = (x > BUFSIZE) ? BUFSIZE : x;
 | 
				
			||||||
 | 
							   if(read(vobf, buf, size) < size)
 | 
				
			||||||
 | 
							   {
 | 
				
			||||||
 | 
							      fprintf(stderr, "Error: unexpected end of stream\n");
 | 
				
			||||||
 | 
							      exit(1);
 | 
				
			||||||
 | 
							   }
 | 
				
			||||||
 | 
					                   x-=size;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							cur_pos = buf;
 | 
				
			||||||
 | 
					                end_pos = buf;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline static void load_next_bytes(long count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   if(cur_pos + count <= end_pos)
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					   if(cur_pos + count > buf + BUFSIZE - 1 )
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      printf ("No buffer space to read %ld bytes\n", count);
 | 
				
			||||||
 | 
					      exit(1);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   count -= (long)(end_pos - cur_pos);
 | 
				
			||||||
 | 
					   if(read(vobf, end_pos, count) < count)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      fprintf(stderr, "Error: unexpected end of stream\n");
 | 
				
			||||||
 | 
					      exit(1);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   end_pos += count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline int next_24_bits(long x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   load_next_bytes(3);
 | 
				
			||||||
 | 
						if (cur_pos[0] != ((x >> 16) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (cur_pos[1] != ((x >>  8) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (cur_pos[2] != ((x      ) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline int next_32_bits(long x)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   load_next_bytes(4);
 | 
				
			||||||
 | 
						if (cur_pos[0] != ((x >> 24) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (cur_pos[1] != ((x >> 16) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (cur_pos[2] != ((x >>  8) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (cur_pos[3] != ((x      ) & 0xff))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void read_write_next_bytes(long count, int outfd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   long size;
 | 
				
			||||||
 | 
					   size = (long)(end_pos - cur_pos);
 | 
				
			||||||
 | 
					   if(size > count)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      write(outfd, cur_pos, count);
 | 
				
			||||||
 | 
					      cur_pos +=count;
 | 
				
			||||||
 | 
					      if(cur_pos == end_pos)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
						 cur_pos = buf;
 | 
				
			||||||
 | 
						 end_pos = buf;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   else if(size > 0)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      write(outfd, cur_pos, size);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   while(count)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      size = (count > BUFSIZE) ? BUFSIZE : count;
 | 
				
			||||||
 | 
					      if(read(vobf, buf, size) < size ||
 | 
				
			||||||
 | 
						 write(outfd, buf, size) < size)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
						 fprintf(stderr, "Error: unexpected end of stream\n");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      count -= size;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   cur_pos = buf;
 | 
				
			||||||
 | 
					   end_pos = buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void parse_pes(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long data_length;
 | 
				
			||||||
 | 
						unsigned long header_length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						load_next_bytes(9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//The header length is the PES_header_data_length byte plus 6 for the packet
 | 
				
			||||||
 | 
						//start code and packet size, 3 for the PES_header_data_length and two
 | 
				
			||||||
 | 
						//misc bytes, and finally 4 bytes for the mystery AC3 packet tag 
 | 
				
			||||||
 | 
						header_length = cur_pos[8] + 6 + 3 + 4 ;
 | 
				
			||||||
 | 
						data_length =(cur_pos[4]<<8) + cur_pos[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//If we have AC-3 audio then output it
 | 
				
			||||||
 | 
						if(cur_pos[3] == 0xbd)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							load_next_bytes(header_length);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
							//Debugging printfs
 | 
				
			||||||
 | 
							fprintf(stderr,"start of pes curpos[] = %02x%02x%02x%02x\n",
 | 
				
			||||||
 | 
								cur_pos[0],cur_pos[1],cur_pos[2],cur_pos[3]);
 | 
				
			||||||
 | 
							fprintf(stderr,"header_length = %d data_length = %x\n",
 | 
				
			||||||
 | 
								header_length, data_length);
 | 
				
			||||||
 | 
							fprintf(stderr,"extra crap 0x%02x%02x%02x%02x data size 0x%0lx\n",cur_pos[header_length-4],
 | 
				
			||||||
 | 
								cur_pos[header_length-3],cur_pos[header_length-2],cur_pos[header_length-1],data_length);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//Only extract the track we want
 | 
				
			||||||
 | 
							if((cur_pos[header_length-4] == track_code )) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							   increment_position(header_length);
 | 
				
			||||||
 | 
								read_write_next_bytes(data_length - header_length + 6, STDOUT_FILENO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
						       increment_position(data_length + 6);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						   //The packet size is data_length plus 6 bytes to account for the
 | 
				
			||||||
 | 
						   //packet start code and the data_length itself.
 | 
				
			||||||
 | 
						   increment_position(data_length + 6);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void parse_pack(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long skip_length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Deal with the pack header 
 | 
				
			||||||
 | 
						// The first 13 bytes are junk. The fourteenth byte 
 | 
				
			||||||
 | 
						// contains the number of stuff bytes 
 | 
				
			||||||
 | 
						load_next_bytes(14);
 | 
				
			||||||
 | 
						skip_length = cur_pos[13] & 0x7;
 | 
				
			||||||
 | 
						increment_position(14 + skip_length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Deal with the system header if it exists 
 | 
				
			||||||
 | 
						if(next_32_bits(0x000001bb))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						// Bytes 5 and 6 contain the length of the header minus 6
 | 
				
			||||||
 | 
					                load_next_bytes(6);
 | 
				
			||||||
 | 
							skip_length = (cur_pos[4] << 8) +  cur_pos[5];
 | 
				
			||||||
 | 
							increment_position(6 + skip_length);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(next_24_bits(0x000001) && !next_32_bits(0x000001ba))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							parse_pes();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int track = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc < 2) {
 | 
				
			||||||
 | 
							fprintf(stderr, "usage: %s mpeg_stream [track number]\n", argv[0]);
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc == 3) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							track = strtol(argv[2], NULL, 0);
 | 
				
			||||||
 | 
							fprintf(stderr,"Extracting track %d\n",track);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (track < 0 || track > 7) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr, "Invalid track number: %d\n", track);
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						track_code = track_table[track];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						file_init(argv[1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!next_32_bits(0x000001ba))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr, "Non-program streams not handled - exiting\n\n");
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						do
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							parse_pack();
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
 | 
						while(next_32_bits(0x000001ba));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fprintf(stderr,"curpos[] = %x%x%x%x\n",cur_pos[0],cur_pos[1],cur_pos[2],cur_pos[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(!next_32_bits(0x000001b9))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr, "Error: expected end of stream code\n");
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(vobf != STDIN_FILENO) close(vobf);
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}		
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
		       Version 2, June 1991
 | 
							       Version 2, June 1991
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
					 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
				
			||||||
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
					 Everyone is permitted to copy and distribute verbatim copies
 | 
				
			||||||
 of this license document, but changing it is not allowed.
 | 
					 of this license document, but changing it is not allowed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    You should have received a copy of the GNU General Public License
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
    along with this program; if not, write to the Free Software
 | 
					    along with this program; if not, write to the Free Software
 | 
				
			||||||
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Also add information on how to contact you by electronic and paper mail.
 | 
					Also add information on how to contact you by electronic and paper mail.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -244,7 +244,6 @@ void asm_open(char *name)
 | 
				
			||||||
        struct stat st;
 | 
					        struct stat st;
 | 
				
			||||||
        char *next;
 | 
					        char *next;
 | 
				
			||||||
        int backup_line_num,backup_file_num;
 | 
					        int backup_line_num,backup_file_num;
 | 
				
			||||||
        size_t rsize;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
| 
						 | 
					@ -285,10 +284,8 @@ void asm_open(char *name)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        buff[i].mem_end = buff[i].mem_start+st.st_size;
 | 
					        buff[i].mem_end = buff[i].mem_start+st.st_size;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        rsize = read(fd, buff[i].mem_start, st.st_size);
 | 
					        read(fd, buff[i].mem_start, st.st_size);
 | 
				
			||||||
        close(fd);
 | 
					        close(fd);
 | 
				
			||||||
        if (rsize != st.st_size)
 | 
					 | 
				
			||||||
                as_exit("short read from input file\n");
 | 
					 | 
				
			||||||
         
 | 
					         
 | 
				
			||||||
#ifdef DEBUG        
 | 
					#ifdef DEBUG        
 | 
				
			||||||
  	printf("File %s opened:\n",name);
 | 
					  	printf("File %s opened:\n",name);
 | 
				
			||||||
| 
						 | 
					@ -369,8 +366,8 @@ void as_exit(const char *message)
 | 
				
			||||||
	exit(1);
 | 
						exit(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void output_tram_line(struct list_head *line_head, int type)
 | 
					inline void output_tram_line( struct list_head *line_head, int type){
 | 
				
			||||||
{
 | 
					        
 | 
				
			||||||
        struct tram *tram_sym;
 | 
					        struct tram *tram_sym;
 | 
				
			||||||
        struct list_head *entry;
 | 
					        struct list_head *entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -386,14 +383,13 @@ void output_tram_line(struct list_head *line_head, int type)
 | 
				
			||||||
                        val = __cpu_to_le32(tram_sym->data.value);
 | 
					                        val = __cpu_to_le32(tram_sym->data.value);
 | 
				
			||||||
                        fwrite(&val,sizeof(u32),1,fp);
 | 
					                        fwrite(&val,sizeof(u32),1,fp);
 | 
				
			||||||
			if(listing){
 | 
								if(listing){
 | 
				
			||||||
				if(type==TYPE_TRAM_ADDR_READ) {
 | 
									if(type==TYPE_TRAM_ADDR_READ)
 | 
				
			||||||
					fprintf(listfile,"\tRead");
 | 
										fprintf(listfile,"\tRead");
 | 
				
			||||||
				} else {
 | 
									else
 | 
				
			||||||
					fprintf(listfile,"\tWrite");
 | 
										fprintf(listfile,"\tWrite");
 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
				fprintf(listfile,": 0x3%02x/0x2%02x (%s), offset 0x%07x\n",tram_sym->data.address,tram_sym->data.address,
 | 
										fprintf(listfile,": 0x3%02x/0x2%02x (%s), offset 0x%07x\n",tram_sym->data.address,tram_sym->data.address,
 | 
				
			||||||
					(prev_sym((&tram_sym->list)))->data.name,tram_sym->data.value);
 | 
											(prev_sym((&tram_sym->list)))->data.name,tram_sym->data.value);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,6 +55,6 @@ int tram_table_count=0;
 | 
				
			||||||
int gpr_constant_count=0;
 | 
					int gpr_constant_count=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char patch_name[PATCH_NAME_SIZE]="NO_NAME";
 | 
					char patch_name[PATCH_NAME_SIZE]="NO_NAME";
 | 
				
			||||||
unsigned int macro_depth=0;
 | 
					int macro_depth=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include"types.h"
 | 
					#include"types.h"
 | 
				
			||||||
#include"proto.h"
 | 
					#include"proto.h"
 | 
				
			||||||
#include"parse.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int dbg_opt;
 | 
					extern int dbg_opt;
 | 
				
			||||||
extern FILE *listfile;
 | 
					extern FILE *listfile;
 | 
				
			||||||
| 
						 | 
					@ -46,6 +45,7 @@ void op(int op, int z,int  w,int  x,int  y)
 | 
				
			||||||
	int  w0, w1;
 | 
						int  w0, w1;
 | 
				
			||||||
        extern int dsp_code[DSP_CODE_SIZE];
 | 
					        extern int dsp_code[DSP_CODE_SIZE];
 | 
				
			||||||
        extern int ip;
 | 
					        extern int ip;
 | 
				
			||||||
 | 
					        extern char op_codes[35][9];
 | 
				
			||||||
	extern char listtemp[60];
 | 
						extern char listtemp[60];
 | 
				
			||||||
	if (ip >= 0x200)
 | 
						if (ip >= 0x200)
 | 
				
			||||||
		as_exit("to many instructions");
 | 
							as_exit("to many instructions");
 | 
				
			||||||
| 
						 | 
					@ -306,6 +306,7 @@ void add_symbol(char *name, u16 type, u16 address, u32 value)
 | 
				
			||||||
       
 | 
					       
 | 
				
			||||||
        extern int gpr_input_count,gpr_output_count,gpr_static_count,gpr_dynamic_count,gpr_control_count,gpr_constant_count;
 | 
					        extern int gpr_input_count,gpr_output_count,gpr_static_count,gpr_dynamic_count,gpr_control_count,gpr_constant_count;
 | 
				
			||||||
        struct sym *sym;
 | 
					        struct sym *sym;
 | 
				
			||||||
 | 
					        struct tram *tmp_ptr;
 | 
				
			||||||
        extern struct list_head sym_head;
 | 
					        extern struct list_head sym_head;
 | 
				
			||||||
        extern struct delay tram_delay[MAX_TANK_ADDR];
 | 
					        extern struct delay tram_delay[MAX_TANK_ADDR];
 | 
				
			||||||
        extern struct lookup tram_lookup[MAX_TANK_ADDR];
 | 
					        extern struct lookup tram_lookup[MAX_TANK_ADDR];
 | 
				
			||||||
| 
						 | 
					@ -355,8 +356,10 @@ void add_symbol(char *name, u16 type, u16 address, u32 value)
 | 
				
			||||||
                        else
 | 
					                        else
 | 
				
			||||||
                                tram_delay[tmp].write++;
 | 
					                                tram_delay[tmp].write++;
 | 
				
			||||||
                }else{
 | 
					                }else{
 | 
				
			||||||
 | 
					                        tmp_ptr=(struct tram *)sym;
 | 
				
			||||||
                        list_add_tail(&(((struct tram *)sym)->tram) , &(tram_lookup[tmp].tram) );
 | 
					                        list_add_tail(&(((struct tram *)sym)->tram) , &(tram_lookup[tmp].tram) );
 | 
				
			||||||
                        if(type== TYPE_TRAM_ADDR_READ)
 | 
								tmp_ptr=(struct tram *)sym;
 | 
				
			||||||
 | 
					                                if(type== TYPE_TRAM_ADDR_READ)
 | 
				
			||||||
                                tram_lookup[tmp].read++;   
 | 
					                                tram_lookup[tmp].read++;   
 | 
				
			||||||
                        else
 | 
					                        else
 | 
				
			||||||
                                tram_lookup[tmp].write++;
 | 
					                                tram_lookup[tmp].write++;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,8 @@
 | 
				
			||||||
AC_INIT(as10k1.c, A0.99)
 | 
					AC_INIT(as10k1.c)
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE(as10k1, A0.99)
 | 
				
			||||||
AC_PROG_CC
 | 
					AC_PROG_CC
 | 
				
			||||||
AC_PROG_INSTALL
 | 
					AC_PROG_INSTALL
 | 
				
			||||||
AC_HEADER_STDC
 | 
					AC_HEADER_STDC
 | 
				
			||||||
AM_INIT_AUTOMAKE
 | 
					 | 
				
			||||||
AM_MAINTAINER_MODE([enable])
 | 
					 | 
				
			||||||
CFLAGS="$CFLAGS"
 | 
					CFLAGS="$CFLAGS"
 | 
				
			||||||
LDFLAGS="$LDFLAGS"
 | 
					LDFLAGS="$LDFLAGS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								as10k1/cvscompile
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								as10k1/cvscompile
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test "x$AUTOMAKE_DIR" = "x"; then
 | 
				
			||||||
 | 
					  if test -d /usr/local/share/automake; then
 | 
				
			||||||
 | 
					    AUTOMAKE_DIR=/usr/local/share/automake
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  if test -d /usr/share/automake; then
 | 
				
			||||||
 | 
					    AUTOMAKE_DIR="/usr/share/automake"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for f in install-sh mkinstalldirs missing; do
 | 
				
			||||||
 | 
					  cp -av $AUTOMAKE_DIR/$f .
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aclocal $ACLOCAL_FLAGS
 | 
				
			||||||
 | 
					automake --foreign --add-missing --copy
 | 
				
			||||||
 | 
					touch depcomp
 | 
				
			||||||
 | 
					autoconf
 | 
				
			||||||
 | 
					export CFLAGS='-O2 -Wall -pipe -g'
 | 
				
			||||||
 | 
					echo "CFLAGS=$CFLAGS"
 | 
				
			||||||
 | 
					echo "./configure $@"
 | 
				
			||||||
 | 
					./configure $@
 | 
				
			||||||
 | 
					unset CFLAGS
 | 
				
			||||||
 | 
					make
 | 
				
			||||||
| 
						 | 
					@ -12,8 +12,6 @@ dsp: $(TARGETS)
 | 
				
			||||||
clean:
 | 
					clean:
 | 
				
			||||||
	rm -f *~ *.emu10k1
 | 
						rm -f *~ *.emu10k1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
distclean: clean
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
distdir:
 | 
					distdir:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,11 +72,14 @@ void new_macro(char *symbol, char *line, char *operand)
 | 
				
			||||||
void macro_expand(int macnum,char *operand )
 | 
					void macro_expand(int macnum,char *operand )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
        char *line,*next;
 | 
					        char *line,*next;
 | 
				
			||||||
        int done=0,old;
 | 
					        int done=0,i,old;
 | 
				
			||||||
        extern unsigned int macro_depth;
 | 
					        extern unsigned int macro_depth;
 | 
				
			||||||
        extern int macro_line_num;
 | 
					        extern int macro_line_num;
 | 
				
			||||||
        char string[MAX_LINE_LENGTH];
 | 
					        char string[MAX_LINE_LENGTH];
 | 
				
			||||||
       
 | 
					       
 | 
				
			||||||
 | 
					        //initialize macro use:
 | 
				
			||||||
 | 
					        i=0;
 | 
				
			||||||
 | 
					       
 | 
				
			||||||
        if(macro_depth+1> MAX_MAC_DEPTH)
 | 
					        if(macro_depth+1> MAX_MAC_DEPTH)
 | 
				
			||||||
                as_exit("Error exceeded maximum number of recursive macro calls");
 | 
					                as_exit("Error exceeded maximum number of recursive macro calls");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,6 @@
 | 
				
			||||||
#include<string.h>
 | 
					#include<string.h>
 | 
				
			||||||
#include<stdio.h>
 | 
					#include<stdio.h>
 | 
				
			||||||
#include"types.h"
 | 
					#include"types.h"
 | 
				
			||||||
#define DECLARE_OP_CODES
 | 
					 | 
				
			||||||
#include"parse.h"
 | 
					#include"parse.h"
 | 
				
			||||||
#include"proto.h" 
 | 
					#include"proto.h" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +87,7 @@ int parse( char line_string[MAX_LINE_LENGTH], char *line)
 | 
				
			||||||
        if((tmp=ismacro(op_name_ptr)) != -1 ){
 | 
					        if((tmp=ismacro(op_name_ptr)) != -1 ){
 | 
				
			||||||
                if(defmacro==0)
 | 
					                if(defmacro==0)
 | 
				
			||||||
                        macro_expand(tmp,strtok(NULL,""));
 | 
					                        macro_expand(tmp,strtok(NULL,""));
 | 
				
			||||||
		return(0);
 | 
								return(0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
        if( (op_num=op_decode(op_name_ptr))==-1) {
 | 
					        if( (op_num=op_decode(op_name_ptr))==-1) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,9 +63,7 @@ enum foo {
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef DECLARE_OP_CODES
 | 
					
 | 
				
			||||||
extern char op_codes[NUM_OPS+1][9];
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
char op_codes[NUM_OPS+1][9]=
 | 
					char op_codes[NUM_OPS+1][9]=
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "MACS",
 | 
					    "MACS",
 | 
				
			||||||
| 
						 | 
					@ -112,7 +110,6 @@ char op_codes[NUM_OPS+1][9]=
 | 
				
			||||||
    "con",
 | 
					    "con",
 | 
				
			||||||
    "NotAnOp"
 | 
					    "NotAnOp"
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//extern int file_num,source_line_num
 | 
					//extern int file_num,source_line_num
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
		       Version 2, June 1991
 | 
							       Version 2, June 1991
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
					 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
				
			||||||
     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
					 Everyone is permitted to copy and distribute verbatim copies
 | 
				
			||||||
 of this license document, but changing it is not allowed.
 | 
					 of this license document, but changing it is not allowed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    You should have received a copy of the GNU General Public License
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
    along with this program; if not, write to the Free Software
 | 
					    along with this program; if not, write to the Free Software
 | 
				
			||||||
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Also add information on how to contact you by electronic and paper mail.
 | 
					Also add information on how to contact you by electronic and paper mail.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,9 @@
 | 
				
			||||||
SUBDIRS = desktop
 | 
					 | 
				
			||||||
AM_CFLAGS = @ECHOMIXER_CFLAGS@
 | 
					AM_CFLAGS = @ECHOMIXER_CFLAGS@
 | 
				
			||||||
bin_PROGRAMS = echomixer
 | 
					bin_PROGRAMS = echomixer
 | 
				
			||||||
man_MANS = 
 | 
					man_MANS = 
 | 
				
			||||||
echomixer_SOURCES = echomixer.c 
 | 
					echomixer_SOURCES = echomixer.c 
 | 
				
			||||||
echomixer_LDADD = @ECHOMIXER_LIBS@
 | 
					echomixer_LDADD = @ECHOMIXER_LIBS@
 | 
				
			||||||
EXTRA_DIST = gitcompile configure.in-gtk1
 | 
					EXTRA_DIST = gitcompile configure.in-gtk1 configure.in-gtk2
 | 
				
			||||||
AUTOMAKE_OPTIONS = foreign
 | 
					AUTOMAKE_OPTIONS = foreign
 | 
				
			||||||
 | 
					
 | 
				
			||||||
alsa-dist: distdir
 | 
					alsa-dist: distdir
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +0,0 @@
 | 
				
			||||||
AC_INIT(echomixer.c, 1.0.5)
 | 
					 | 
				
			||||||
AC_PROG_CC
 | 
					 | 
				
			||||||
AC_PROG_INSTALL
 | 
					 | 
				
			||||||
AC_HEADER_STDC
 | 
					 | 
				
			||||||
AM_INIT_AUTOMAKE
 | 
					 | 
				
			||||||
AM_MAINTAINER_MODE([enable])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(ECHOMIXER, gtk+-2.0 alsa >= 1.0.0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_OUTPUT(Makefile desktop/Makefile)
 | 
					 | 
				
			||||||
							
								
								
									
										27
									
								
								echomixer/configure.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								echomixer/configure.in
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					dnl Process this file with autoconf to produce a configure script.
 | 
				
			||||||
 | 
					AC_INIT(echomixer.c)
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE(echomixer, 1.0.5)
 | 
				
			||||||
 | 
					AC_PROG_CC
 | 
				
			||||||
 | 
					AC_PROG_INSTALL
 | 
				
			||||||
 | 
					AC_HEADER_STDC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_WITH(gtk2,
 | 
				
			||||||
 | 
					  [  --with-gtk2=yes,no   Build with GTK+2 (default = yes)],
 | 
				
			||||||
 | 
					  with_gtk2="$withval", with_gtk2="yes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test "$with_gtk2" = "yes"; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES(ECHOMIXER, gtk+-2.0 alsa >= 1.0.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_PATH_GTK(1.2.0)
 | 
				
			||||||
 | 
					AM_PATH_ALSA(1.0.0)
 | 
				
			||||||
 | 
					ECHOMIXER_CFLAGS="$CFLAGS $ALSA_CFLAGS $GTK_CFLAGS"
 | 
				
			||||||
 | 
					ECHOMIXER_LIBS="$LIBS $ALSA_LIBS $GTK_LIBS"
 | 
				
			||||||
 | 
					AC_SUBST(ECHOMIXER_CFLAGS)
 | 
				
			||||||
 | 
					AC_SUBST(ECHOMIXER_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_OUTPUT(Makefile)
 | 
				
			||||||
							
								
								
									
										9
									
								
								echomixer/configure.in-gtk2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								echomixer/configure.in-gtk2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					AC_INIT(echomixer.c)
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE(echomixer, 1.0.5)
 | 
				
			||||||
 | 
					AC_PROG_CC
 | 
				
			||||||
 | 
					AC_PROG_INSTALL
 | 
				
			||||||
 | 
					AC_HEADER_STDC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES(ECHOMIXER, gtk+-2.0 alsa >= 1.0.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_OUTPUT(Makefile)
 | 
				
			||||||
							
								
								
									
										25
									
								
								echomixer/cvscompile
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								echomixer/cvscompile
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test "x$AUTOMAKE_DIR" = "x"; then
 | 
				
			||||||
 | 
					  if test -d /usr/local/share/automake; then
 | 
				
			||||||
 | 
					    AUTOMAKE_DIR=/usr/local/share/automake
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  if test -d /usr/share/automake; then
 | 
				
			||||||
 | 
					    AUTOMAKE_DIR="/usr/share/automake"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for f in install-sh mkinstalldirs missing; do
 | 
				
			||||||
 | 
					  cp -av $AUTOMAKE_DIR/$f .
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aclocal $ACLOCAL_FLAGS
 | 
				
			||||||
 | 
					automake --add-missing --copy
 | 
				
			||||||
 | 
					touch depcomp
 | 
				
			||||||
 | 
					autoconf
 | 
				
			||||||
 | 
					export CFLAGS='-O2 -Wall -pipe -g'
 | 
				
			||||||
 | 
					echo "CFLAGS=$CFLAGS"
 | 
				
			||||||
 | 
					echo "./configure $@"
 | 
				
			||||||
 | 
					./configure $@
 | 
				
			||||||
 | 
					unset CFLAGS
 | 
				
			||||||
 | 
					make
 | 
				
			||||||
| 
						 | 
					@ -1,34 +0,0 @@
 | 
				
			||||||
APPNAME = echomixer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
desktopdir = $(datadir)/applications
 | 
					 | 
				
			||||||
desktop_DATA = $(APPNAME).desktop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public_icons = \
 | 
					 | 
				
			||||||
	hicolor_apps_48x48_$(APPNAME).png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST = \
 | 
					 | 
				
			||||||
	$(public_icons)		\
 | 
					 | 
				
			||||||
	$(desktop_DATA)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-icons:
 | 
					 | 
				
			||||||
	for icon in $(public_icons); do \
 | 
					 | 
				
			||||||
		THEME=`echo $$icon | cut -d_ -f1`; \
 | 
					 | 
				
			||||||
		CONTEXT=`echo $$icon | cut -d_ -f2`; \
 | 
					 | 
				
			||||||
		SIZE=`echo $$icon | cut -d_ -f3`; \
 | 
					 | 
				
			||||||
		ICONFILE=`echo $$icon | cut -d_ -f4`; \
 | 
					 | 
				
			||||||
		mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
 | 
					 | 
				
			||||||
		$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall-icons:
 | 
					 | 
				
			||||||
	-for icon in $(public_icons); do \
 | 
					 | 
				
			||||||
		THEME=`echo $$icon | cut -d_ -f1`; \
 | 
					 | 
				
			||||||
		CONTEXT=`echo $$icon | cut -d_ -f2`; \
 | 
					 | 
				
			||||||
		SIZE=`echo $$icon | cut -d_ -f3`; \
 | 
					 | 
				
			||||||
		ICONFILE=`echo $$icon | cut -d_ -f4`; \
 | 
					 | 
				
			||||||
		rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-local: install-icons
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall-local: uninstall-icons
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,10 +0,0 @@
 | 
				
			||||||
[Desktop Entry]
 | 
					 | 
				
			||||||
Name=Echomixer
 | 
					 | 
				
			||||||
GenericName=Control Echo Digital Audio sound cards
 | 
					 | 
				
			||||||
Comment=Mixer and GUI control utility for Echo Digital Audio sound cards
 | 
					 | 
				
			||||||
Exec=echomixer
 | 
					 | 
				
			||||||
Icon=echomixer
 | 
					 | 
				
			||||||
Terminal=false
 | 
					 | 
				
			||||||
Type=Application
 | 
					 | 
				
			||||||
Categories=AudioVideo;
 | 
					 | 
				
			||||||
Version=0.9.4
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 841 B  | 
| 
						 | 
					@ -13,7 +13,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *  You should have received a copy of the GNU General Public License
 | 
					 *  You should have received a copy of the GNU General Public License
 | 
				
			||||||
 *  along with this program; if not, write to the Free Software
 | 
					 *  along with this program; if not, write to the Free Software
 | 
				
			||||||
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EM_VERSION "%s Echomixer v" VERSION
 | 
					#define EM_VERSION "%s Echomixer v" VERSION
 | 
				
			||||||
| 
						 | 
					@ -525,25 +525,6 @@ void GetChannels(void) {
 | 
				
			||||||
    nLOut=snd_ctl_elem_value_get_integer(control, 2);	// Number of output channels
 | 
					    nLOut=snd_ctl_elem_value_get_integer(control, 2);	// Number of output channels
 | 
				
			||||||
    fdOut=snd_ctl_elem_value_get_integer(control, 3);	// First digital out
 | 
					    fdOut=snd_ctl_elem_value_get_integer(control, 3);	// First digital out
 | 
				
			||||||
    nPOut=snd_ctl_elem_value_get_integer(control, 4);	// Number of virtual output channels (==nLOut on non-vmixer cards)
 | 
					    nPOut=snd_ctl_elem_value_get_integer(control, 4);	// Number of virtual output channels (==nLOut on non-vmixer cards)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    mixerControl.outputs = nLOut;
 | 
					 | 
				
			||||||
    mixerControl.inputs = nIn;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (vmixerId) {
 | 
					 | 
				
			||||||
      vmixerControl.outputs = nLOut;
 | 
					 | 
				
			||||||
      vmixerControl.inputs = nPOut;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      /* For outputs and inputs. */
 | 
					 | 
				
			||||||
      metersStreams = 2;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      /* For outputs, inputs and system outputs. */
 | 
					 | 
				
			||||||
      metersStreams = 3;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* For the number of channels. */
 | 
					 | 
				
			||||||
    metersNumber = 16;
 | 
					 | 
				
			||||||
    /* For each of levels and peaks. */
 | 
					 | 
				
			||||||
    metersTypes = 2;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  ClockMask=snd_ctl_elem_value_get_integer(control, 5);	// Bitmask of available input clocks
 | 
					  ClockMask=snd_ctl_elem_value_get_integer(control, 5);	// Bitmask of available input clocks
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -629,7 +610,9 @@ gint DrawMixer(gpointer unused) {
 | 
				
			||||||
  int OutPeak[ECHO_MAXAUDIOOUTPUTS];
 | 
					  int OutPeak[ECHO_MAXAUDIOOUTPUTS];
 | 
				
			||||||
  int VirLevel[ECHO_MAXAUDIOOUTPUTS];
 | 
					  int VirLevel[ECHO_MAXAUDIOOUTPUTS];
 | 
				
			||||||
  int VirPeak[ECHO_MAXAUDIOOUTPUTS];
 | 
					  int VirPeak[ECHO_MAXAUDIOOUTPUTS];
 | 
				
			||||||
  char str[16];
 | 
					  static int InClip[ECHO_MAXAUDIOINPUTS];
 | 
				
			||||||
 | 
					  static int OutClip[ECHO_MAXAUDIOOUTPUTS];
 | 
				
			||||||
 | 
					  char str[8];
 | 
				
			||||||
  int i, o, dB;
 | 
					  int i, o, dB;
 | 
				
			||||||
  GdkColor Grid={0x787878, 0, 0, 0};
 | 
					  GdkColor Grid={0x787878, 0, 0, 0};
 | 
				
			||||||
  GdkColor Labels={0x9694C4, 0, 0, 0};
 | 
					  GdkColor Labels={0x9694C4, 0, 0, 0};
 | 
				
			||||||
| 
						 | 
					@ -645,8 +628,13 @@ gint DrawMixer(gpointer unused) {
 | 
				
			||||||
  update_rect.height = Mixheight;
 | 
					  update_rect.height = Mixheight;
 | 
				
			||||||
  GetVUmeters(InLevel, InPeak, OutLevel, OutPeak, VirLevel, VirPeak);
 | 
					  GetVUmeters(InLevel, InPeak, OutLevel, OutPeak, VirLevel, VirPeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!gc)
 | 
					  if (!gc) {
 | 
				
			||||||
    gc=gdk_gc_new(gtk_widget_get_parent_window(Mixdarea));
 | 
					    gc=gdk_gc_new(gtk_widget_get_parent_window(Mixdarea));
 | 
				
			||||||
 | 
					    for (i=0; i<nIn; i++)
 | 
				
			||||||
 | 
					      InClip[i]=0;
 | 
				
			||||||
 | 
					    for (i=0; i<nLOut; i++)
 | 
				
			||||||
 | 
					      OutClip[i]=0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gdk_draw_rectangle(Mixpixmap, Mixdarea->style->black_gc, TRUE, 0, 0, Mixwidth, Mixheight);
 | 
					  gdk_draw_rectangle(Mixpixmap, Mixdarea->style->black_gc, TRUE, 0, 0, Mixwidth, Mixheight);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1686,7 +1674,7 @@ void ToggleWindow(GtkWidget *widget, gpointer window) {
 | 
				
			||||||
// Scan all controls and sets up the structures needed to access them.
 | 
					// Scan all controls and sets up the structures needed to access them.
 | 
				
			||||||
int OpenControls(const char *card, const char *cardname) {
 | 
					int OpenControls(const char *card, const char *cardname) {
 | 
				
			||||||
  int err, i, o;
 | 
					  int err, i, o;
 | 
				
			||||||
  int numid, items, item;
 | 
					  int numid, count, items, item;
 | 
				
			||||||
  snd_hctl_t *handle;
 | 
					  snd_hctl_t *handle;
 | 
				
			||||||
  snd_hctl_elem_t *elem;
 | 
					  snd_hctl_elem_t *elem;
 | 
				
			||||||
  snd_ctl_elem_id_t *id;
 | 
					  snd_ctl_elem_id_t *id;
 | 
				
			||||||
| 
						 | 
					@ -1719,15 +1707,20 @@ int OpenControls(const char *card, const char *cardname) {
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    snd_hctl_elem_get_id(elem, id);
 | 
					    snd_hctl_elem_get_id(elem, id);
 | 
				
			||||||
    numid=snd_ctl_elem_id_get_numid(id);
 | 
					    numid=snd_ctl_elem_id_get_numid(id);
 | 
				
			||||||
 | 
					    count=snd_ctl_elem_info_get_count(info);
 | 
				
			||||||
    if (!strcmp("Monitor Mixer Volume", snd_ctl_elem_id_get_name(id))) {
 | 
					    if (!strcmp("Monitor Mixer Volume", snd_ctl_elem_id_get_name(id))) {
 | 
				
			||||||
      if (!mixerId) {
 | 
					      if (!mixerId) {
 | 
				
			||||||
        mixerId=numid;
 | 
					        mixerId=numid;
 | 
				
			||||||
        CTLID_DEBUG(("First Mixer id=%d\n", mixerId));
 | 
					        CTLID_DEBUG(("First Mixer id=%d\n", mixerId));
 | 
				
			||||||
 | 
					        mixerControl.outputs=snd_ctl_elem_info_get_dimension(info, 0);
 | 
				
			||||||
 | 
					        mixerControl.inputs=snd_ctl_elem_info_get_dimension(info, 1);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else if (!strcmp("VMixer Volume", snd_ctl_elem_id_get_name(id))) {
 | 
					    } else if (!strcmp("VMixer Volume", snd_ctl_elem_id_get_name(id))) {
 | 
				
			||||||
      if (!vmixerId) {
 | 
					      if (!vmixerId) {
 | 
				
			||||||
        vmixerId=vmixerControl.id=numid;
 | 
					        vmixerId=vmixerControl.id=numid;
 | 
				
			||||||
        CTLID_DEBUG(("First Vmixer id=%d\n", vmixerId));
 | 
					        CTLID_DEBUG(("First Vmixer id=%d\n", vmixerId));
 | 
				
			||||||
 | 
					        vmixerControl.outputs=snd_ctl_elem_info_get_dimension(info, 0);
 | 
				
			||||||
 | 
					        vmixerControl.inputs=snd_ctl_elem_info_get_dimension(info, 1);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else if (!strcmp("PCM Playback Volume", snd_ctl_elem_id_get_name(id))) {
 | 
					    } else if (!strcmp("PCM Playback Volume", snd_ctl_elem_id_get_name(id))) {
 | 
				
			||||||
      pcmoutId=pcmoutControl.id=numid;
 | 
					      pcmoutId=pcmoutControl.id=numid;
 | 
				
			||||||
| 
						 | 
					@ -1796,6 +1789,9 @@ int OpenControls(const char *card, const char *cardname) {
 | 
				
			||||||
      CTLID_DEBUG(("VU-meter switch id=%d\n", numid));
 | 
					      CTLID_DEBUG(("VU-meter switch id=%d\n", numid));
 | 
				
			||||||
    } else if (!strcmp("VU-meters", snd_ctl_elem_id_get_name(id))) {
 | 
					    } else if (!strcmp("VU-meters", snd_ctl_elem_id_get_name(id))) {
 | 
				
			||||||
      vumetersId=numid;
 | 
					      vumetersId=numid;
 | 
				
			||||||
 | 
					      metersStreams=snd_ctl_elem_info_get_dimension(info, 0);	// 2 or 3: output, input and (vmixer cards only) pcm
 | 
				
			||||||
 | 
					      metersNumber=snd_ctl_elem_info_get_dimension(info, 1);	// Number of channels
 | 
				
			||||||
 | 
					      metersTypes=snd_ctl_elem_info_get_dimension(info, 2);	// 2: level and peak
 | 
				
			||||||
      CTLID_DEBUG(("VU-meters id=%d\n", numid));
 | 
					      CTLID_DEBUG(("VU-meters id=%d\n", numid));
 | 
				
			||||||
    } else if (!strcmp("Channels info", snd_ctl_elem_id_get_name(id))) {
 | 
					    } else if (!strcmp("Channels info", snd_ctl_elem_id_get_name(id))) {
 | 
				
			||||||
      channelsId=numid;
 | 
					      channelsId=numid;
 | 
				
			||||||
| 
						 | 
					@ -1871,7 +1867,7 @@ int main(int argc, char *argv[]) {
 | 
				
			||||||
  GtkWidget *label, *menu, *menuitem;
 | 
					  GtkWidget *label, *menu, *menuitem;
 | 
				
			||||||
  GSList *bgroup;
 | 
					  GSList *bgroup;
 | 
				
			||||||
  int err, i, o, n, cardnum, value;
 | 
					  int err, i, o, n, cardnum, value;
 | 
				
			||||||
  char hwname[16], cardname[32], load, save;
 | 
					  char hwname[8], cardname[32], load, save;
 | 
				
			||||||
  snd_ctl_card_info_t *hw_info;
 | 
					  snd_ctl_card_info_t *hw_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  load=save=1;
 | 
					  load=save=1;
 | 
				
			||||||
| 
						 | 
					@ -1892,8 +1888,8 @@ int main(int argc, char *argv[]) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if ((err=snd_ctl_card_info(ctlhandle, hw_info))>=0) {
 | 
					    if ((err=snd_ctl_card_info(ctlhandle, hw_info))>=0) {
 | 
				
			||||||
      if (!strncmp(snd_ctl_card_info_get_driver(hw_info), "Echo_", 5)) {
 | 
					      if (!strncmp(snd_ctl_card_info_get_driver(hw_info), "Echo_", 5)) {
 | 
				
			||||||
        strncpy(card, hwname, sizeof(hwname)-1);
 | 
					        strncpy(card, hwname, 7);
 | 
				
			||||||
        card[sizeof(hwname)-1]=0;
 | 
					        hwname[7]=0;
 | 
				
			||||||
        strncpy(cardname, snd_ctl_card_info_get_name(hw_info), 31);
 | 
					        strncpy(cardname, snd_ctl_card_info_get_name(hw_info), 31);
 | 
				
			||||||
        cardname[31]=0;
 | 
					        cardname[31]=0;
 | 
				
			||||||
        strncpy(cardId, snd_ctl_card_info_get_name(hw_info), 15);
 | 
					        strncpy(cardId, snd_ctl_card_info_get_name(hw_info), 15);
 | 
				
			||||||
| 
						 | 
					@ -2097,7 +2093,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    for (i=0; i<ndmodes; i++) {
 | 
					    for (i=0; i<ndmodes; i++) {
 | 
				
			||||||
      menuitem=gtk_menu_item_new_with_label(dmodeName[i]);
 | 
					      menuitem=gtk_menu_item_new_with_label(dmodeName[i]);
 | 
				
			||||||
      gtk_widget_show(menuitem);
 | 
					      gtk_widget_show(menuitem);
 | 
				
			||||||
      gtk_signal_connect(GTK_OBJECT(menuitem), "activate", G_CALLBACK(Digital_mode_activate), (gpointer)(long)i);
 | 
					      gtk_signal_connect(GTK_OBJECT(menuitem), "activate", Digital_mode_activate, (gpointer)(long)i);
 | 
				
			||||||
      gtk_menu_append(GTK_MENU(menu), menuitem);
 | 
					      gtk_menu_append(GTK_MENU(menu), menuitem);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    gtk_option_menu_set_menu(GTK_OPTION_MENU(dmodeOpt), menu);
 | 
					    gtk_option_menu_set_menu(GTK_OPTION_MENU(dmodeOpt), menu);
 | 
				
			||||||
| 
						 | 
					@ -2123,7 +2119,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
      clocksrc_menuitem[i]=gtk_menu_item_new_with_label(clocksrcName[i]);
 | 
					      clocksrc_menuitem[i]=gtk_menu_item_new_with_label(clocksrcName[i]);
 | 
				
			||||||
      gtk_widget_show(clocksrc_menuitem[i]);
 | 
					      gtk_widget_show(clocksrc_menuitem[i]);
 | 
				
			||||||
      gtk_widget_set_sensitive(clocksrc_menuitem[i], FALSE);
 | 
					      gtk_widget_set_sensitive(clocksrc_menuitem[i], FALSE);
 | 
				
			||||||
      gtk_signal_connect(GTK_OBJECT(clocksrc_menuitem[i]), "activate", G_CALLBACK(Clock_source_activate), (gpointer)(long)i);
 | 
					      gtk_signal_connect(GTK_OBJECT(clocksrc_menuitem[i]), "activate", Clock_source_activate, (gpointer)(long)i);
 | 
				
			||||||
      gtk_menu_append(GTK_MENU(menu), clocksrc_menuitem[i]);
 | 
					      gtk_menu_append(GTK_MENU(menu), clocksrc_menuitem[i]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    gtk_option_menu_set_menu(GTK_OPTION_MENU(clocksrcOpt), menu);
 | 
					    gtk_option_menu_set_menu(GTK_OPTION_MENU(clocksrcOpt), menu);
 | 
				
			||||||
| 
						 | 
					@ -2149,7 +2145,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    for (i=0; i<nspdifmodes; i++) {
 | 
					    for (i=0; i<nspdifmodes; i++) {
 | 
				
			||||||
      menuitem=gtk_menu_item_new_with_label(spdifmodeName[i]);
 | 
					      menuitem=gtk_menu_item_new_with_label(spdifmodeName[i]);
 | 
				
			||||||
      gtk_widget_show(menuitem);
 | 
					      gtk_widget_show(menuitem);
 | 
				
			||||||
      gtk_signal_connect(GTK_OBJECT(menuitem), "activate", G_CALLBACK(SPDIF_mode_activate), (gpointer)(long)i);
 | 
					      gtk_signal_connect(GTK_OBJECT(menuitem), "activate", SPDIF_mode_activate, (gpointer)(long)i);
 | 
				
			||||||
      gtk_menu_append(GTK_MENU(menu), menuitem);
 | 
					      gtk_menu_append(GTK_MENU(menu), menuitem);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    gtk_option_menu_set_menu(GTK_OPTION_MENU(spdifmodeOpt), menu);
 | 
					    gtk_option_menu_set_menu(GTK_OPTION_MENU(spdifmodeOpt), menu);
 | 
				
			||||||
| 
						 | 
					@ -2174,7 +2170,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
      gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
 | 
					      gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
 | 
				
			||||||
      ReadControl(&i, 1, PhantomPower.id, SND_CTL_ELEM_IFACE_MIXER);
 | 
					      ReadControl(&i, 1, PhantomPower.id, SND_CTL_ELEM_IFACE_MIXER);
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i);
 | 
				
			||||||
      gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(Switch_toggled), (gpointer)&PhantomPower);
 | 
					      gtk_signal_connect(GTK_OBJECT(button), "toggled", Switch_toggled, (gpointer)&PhantomPower);
 | 
				
			||||||
      PhantomPower.Button=button;
 | 
					      PhantomPower.Button=button;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2185,7 +2181,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
      gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
 | 
					      gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
 | 
				
			||||||
      ReadControl(&i, 1, Automute.id, SND_CTL_ELEM_IFACE_CARD);
 | 
					      ReadControl(&i, 1, Automute.id, SND_CTL_ELEM_IFACE_CARD);
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), i);
 | 
				
			||||||
      gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(Switch_toggled), (gpointer)&Automute);
 | 
					      gtk_signal_connect(GTK_OBJECT(button), "toggled", Switch_toggled, (gpointer)&Automute);
 | 
				
			||||||
      Automute.Button=button;
 | 
					      Automute.Button=button;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2194,7 +2190,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
      autoclockChkbutton=gtk_check_button_new_with_label("Autoclock");
 | 
					      autoclockChkbutton=gtk_check_button_new_with_label("Autoclock");
 | 
				
			||||||
      gtk_widget_show(autoclockChkbutton);
 | 
					      gtk_widget_show(autoclockChkbutton);
 | 
				
			||||||
      gtk_box_pack_start(GTK_BOX(hbox), autoclockChkbutton, TRUE, FALSE, 0);
 | 
					      gtk_box_pack_start(GTK_BOX(hbox), autoclockChkbutton, TRUE, FALSE, 0);
 | 
				
			||||||
      gtk_signal_connect(GTK_OBJECT(autoclockChkbutton), "toggled", G_CALLBACK(AutoClock_toggled), NULL);
 | 
					      gtk_signal_connect(GTK_OBJECT(autoclockChkbutton), "toggled", AutoClock_toggled, NULL);
 | 
				
			||||||
      AutoClock=-1;
 | 
					      AutoClock=-1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -2664,7 +2660,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
 | 
					  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
 | 
				
			||||||
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), 1);
 | 
					  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), 1);
 | 
				
			||||||
  gtk_widget_show(button);
 | 
					  gtk_widget_show(button);
 | 
				
			||||||
  gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(Gang_button_toggled), 0);
 | 
					  gtk_signal_connect(GTK_OBJECT(button), "toggled", Gang_button_toggled, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Controls frame
 | 
					  // Controls frame
 | 
				
			||||||
  frame=gtk_frame_new("Controls");
 | 
					  frame=gtk_frame_new("Controls");
 | 
				
			||||||
| 
						 | 
					@ -2679,7 +2675,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    button=gtk_toggle_button_new_with_label("VU");
 | 
					    button=gtk_toggle_button_new_with_label("VU");
 | 
				
			||||||
    gtk_widget_show(button);
 | 
					    gtk_widget_show(button);
 | 
				
			||||||
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
    gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(VUmeters_button_click), 0);
 | 
					    gtk_signal_connect(GTK_OBJECT(button), "toggled", VUmeters_button_click, 0);
 | 
				
			||||||
    VUw_geom.toggler=button;
 | 
					    VUw_geom.toggler=button;
 | 
				
			||||||
    if (VUw_geom.st==1)
 | 
					    if (VUw_geom.st==1)
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					@ -2689,7 +2685,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
  button=gtk_toggle_button_new_with_label("Line");
 | 
					  button=gtk_toggle_button_new_with_label("Line");
 | 
				
			||||||
  gtk_widget_show(button);
 | 
					  gtk_widget_show(button);
 | 
				
			||||||
  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					  gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
  gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)LVwindow);
 | 
					  gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)LVwindow);
 | 
				
			||||||
  LVw_geom.toggler=button;
 | 
					  LVw_geom.toggler=button;
 | 
				
			||||||
  if (LVw_geom.st==1)
 | 
					  if (LVw_geom.st==1)
 | 
				
			||||||
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					@ -2699,7 +2695,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    button=gtk_toggle_button_new_with_label("Misc");
 | 
					    button=gtk_toggle_button_new_with_label("Misc");
 | 
				
			||||||
    gtk_widget_show(button);
 | 
					    gtk_widget_show(button);
 | 
				
			||||||
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
    gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)Miscwindow);
 | 
					    gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)Miscwindow);
 | 
				
			||||||
    Miscw_geom.toggler=button;
 | 
					    Miscw_geom.toggler=button;
 | 
				
			||||||
    if (Miscw_geom.st==1)
 | 
					    if (Miscw_geom.st==1)
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					@ -2710,7 +2706,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    button=gtk_toggle_button_new_with_label("GrMix");
 | 
					    button=gtk_toggle_button_new_with_label("GrMix");
 | 
				
			||||||
    gtk_widget_show(button);
 | 
					    gtk_widget_show(button);
 | 
				
			||||||
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
    gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(GMixer_button_click), 0);
 | 
					    gtk_signal_connect(GTK_OBJECT(button), "toggled", GMixer_button_click, 0);
 | 
				
			||||||
    GMw_geom.toggler=button;
 | 
					    GMw_geom.toggler=button;
 | 
				
			||||||
    if (GMw_geom.st==1)
 | 
					    if (GMw_geom.st==1)
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					@ -2719,7 +2715,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    button=gtk_toggle_button_new_with_label("Mixer");
 | 
					    button=gtk_toggle_button_new_with_label("Mixer");
 | 
				
			||||||
    gtk_widget_show(button);
 | 
					    gtk_widget_show(button);
 | 
				
			||||||
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
    gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)mixerControl.window);
 | 
					    gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)mixerControl.window);
 | 
				
			||||||
    Mixerw_geom.toggler=button;
 | 
					    Mixerw_geom.toggler=button;
 | 
				
			||||||
    if (Mixerw_geom.st==1)
 | 
					    if (Mixerw_geom.st==1)
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					@ -2730,7 +2726,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    button=gtk_toggle_button_new_with_label("Vmixer");
 | 
					    button=gtk_toggle_button_new_with_label("Vmixer");
 | 
				
			||||||
    gtk_widget_show(button);
 | 
					    gtk_widget_show(button);
 | 
				
			||||||
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
    gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)vmixerControl.window);
 | 
					    gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)vmixerControl.window);
 | 
				
			||||||
    Vmixerw_geom.toggler=button;
 | 
					    Vmixerw_geom.toggler=button;
 | 
				
			||||||
    if (Vmixerw_geom.st==1)
 | 
					    if (Vmixerw_geom.st==1)
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					@ -2741,7 +2737,7 @@ printf("components = %s\n", snd_ctl_card_info_get_components(hw_info));*/
 | 
				
			||||||
    button=gtk_toggle_button_new_with_label("PCM");
 | 
					    button=gtk_toggle_button_new_with_label("PCM");
 | 
				
			||||||
    gtk_widget_show(button);
 | 
					    gtk_widget_show(button);
 | 
				
			||||||
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
					    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 1);
 | 
				
			||||||
    gtk_signal_connect(GTK_OBJECT(button), "toggled", G_CALLBACK(ToggleWindow), (gpointer)pcmoutControl.window);
 | 
					    gtk_signal_connect(GTK_OBJECT(button), "toggled", ToggleWindow, (gpointer)pcmoutControl.window);
 | 
				
			||||||
    PVw_geom.toggler=button;
 | 
					    PVw_geom.toggler=button;
 | 
				
			||||||
    if (PVw_geom.st==1)
 | 
					    if (PVw_geom.st==1)
 | 
				
			||||||
      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
					      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
		       Version 2, June 1991
 | 
							       Version 2, June 1991
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
					 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
				
			||||||
                       51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
					 Everyone is permitted to copy and distribute verbatim copies
 | 
				
			||||||
 of this license document, but changing it is not allowed.
 | 
					 of this license document, but changing it is not allowed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    You should have received a copy of the GNU General Public License
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
    along with this program; if not, write to the Free Software
 | 
					    along with this program; if not, write to the Free Software
 | 
				
			||||||
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Also add information on how to contact you by electronic and paper mail.
 | 
					Also add information on how to contact you by electronic and paper mail.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,3 @@
 | 
				
			||||||
SUBDIRS = desktop
 | 
					 | 
				
			||||||
AM_CFLAGS = @ENVY24CONTROL_CFLAGS@
 | 
					AM_CFLAGS = @ENVY24CONTROL_CFLAGS@
 | 
				
			||||||
bin_PROGRAMS = envy24control
 | 
					bin_PROGRAMS = envy24control
 | 
				
			||||||
man_MANS = envy24control.1
 | 
					man_MANS = envy24control.1
 | 
				
			||||||
| 
						 | 
					@ -7,7 +6,7 @@ envy24control_SOURCES = envy24control.c envy24control.h levelmeters.c midi.c \
 | 
				
			||||||
			profiles.c profiles.h midi.h config.c config.h
 | 
								profiles.c profiles.h midi.h config.c config.h
 | 
				
			||||||
envy24control_LDADD = @ENVY24CONTROL_LIBS@
 | 
					envy24control_LDADD = @ENVY24CONTROL_LIBS@
 | 
				
			||||||
EXTRA_DIST = gitcompile envy24control.1 depcomp configure.in-gtk1 \
 | 
					EXTRA_DIST = gitcompile envy24control.1 depcomp configure.in-gtk1 \
 | 
				
			||||||
	     strstr_icase_blank.c new_process.c \
 | 
						     configure.in-gtk2 strstr_icase_blank.c new_process.c \
 | 
				
			||||||
	     README.profiles
 | 
						     README.profiles
 | 
				
			||||||
AUTOMAKE_OPTIONS = foreign
 | 
					AUTOMAKE_OPTIONS = foreign
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,8 +46,8 @@ void config_close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void config_set_stereo(GtkWidget *but, gpointer data)
 | 
					void config_set_stereo(GtkWidget *but, gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  gint i=GPOINTER_TO_INT(data);
 | 
					  gint i=(gint)data;
 | 
				
			||||||
  config_stereo[i]=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(but));
 | 
					  config_stereo[i]=GTK_TOGGLE_BUTTON(but)->active;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void config_restore_stereo()
 | 
					void config_restore_stereo()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +0,0 @@
 | 
				
			||||||
AC_INIT(envy24control.c, 0.6.0)
 | 
					 | 
				
			||||||
AC_PROG_CC
 | 
					 | 
				
			||||||
AC_PROG_INSTALL
 | 
					 | 
				
			||||||
AC_HEADER_STDC
 | 
					 | 
				
			||||||
AM_INIT_AUTOMAKE
 | 
					 | 
				
			||||||
AM_MAINTAINER_MODE([enable])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES(ENVY24CONTROL, gtk+-3.0 alsa >= 0.9.0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_OUTPUT(Makefile desktop/Makefile)
 | 
					 | 
				
			||||||
							
								
								
									
										26
									
								
								envy24control/configure.in
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								envy24control/configure.in
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,26 @@
 | 
				
			||||||
 | 
					AC_INIT(envy24control.c)
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE(envy24control, 0.6.0)
 | 
				
			||||||
 | 
					AC_PROG_CC
 | 
				
			||||||
 | 
					AC_PROG_INSTALL
 | 
				
			||||||
 | 
					AC_HEADER_STDC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_WITH(gtk2,
 | 
				
			||||||
 | 
					  [  --with-gtk2=yes,no   Build with GTK+2 (default = yes)],
 | 
				
			||||||
 | 
					  with_gtk2="$withval", with_gtk2="yes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test "$with_gtk2" = "yes"; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES(ENVY24CONTROL, gtk+-2.0 alsa >= 0.9.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_PATH_GTK(1.0.1)
 | 
				
			||||||
 | 
					AM_PATH_ALSA(1.0.0)
 | 
				
			||||||
 | 
					ENVY24CONTROL_CFLAGS="$CFLAGS $ALSA_CFLAGS $GTK_CFLAGS"
 | 
				
			||||||
 | 
					ENVY24CONTROL_LIBS="$LIBS $ALSA_LIBS $GTK_LIBS"
 | 
				
			||||||
 | 
					AC_SUBST(ENVY24CONTROL_CFLAGS)
 | 
				
			||||||
 | 
					AC_SUBST(ENVY24CONTROL_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_OUTPUT(Makefile)
 | 
				
			||||||
							
								
								
									
										9
									
								
								envy24control/configure.in-gtk2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								envy24control/configure.in-gtk2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					AC_INIT(envy24control.c)
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE(envy24control, 0.6.0)
 | 
				
			||||||
 | 
					AC_PROG_CC
 | 
				
			||||||
 | 
					AC_PROG_INSTALL
 | 
				
			||||||
 | 
					AC_HEADER_STDC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES(ENVY24CONTROL, gtk+-2.0 alsa >= 0.9.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_OUTPUT(Makefile)
 | 
				
			||||||
							
								
								
									
										25
									
								
								envy24control/cvscompile
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								envy24control/cvscompile
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test "x$AUTOMAKE_DIR" = "x"; then
 | 
				
			||||||
 | 
					  if test -d /usr/local/share/automake; then
 | 
				
			||||||
 | 
					    AUTOMAKE_DIR=/usr/local/share/automake
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  if test -d /usr/share/automake; then
 | 
				
			||||||
 | 
					    AUTOMAKE_DIR="/usr/share/automake"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for f in install-sh mkinstalldirs missing; do
 | 
				
			||||||
 | 
					  cp -av $AUTOMAKE_DIR/$f .
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aclocal $ACLOCAL_FLAGS
 | 
				
			||||||
 | 
					automake --foreign --add-missing --copy
 | 
				
			||||||
 | 
					touch depcomp
 | 
				
			||||||
 | 
					autoconf
 | 
				
			||||||
 | 
					export CFLAGS='-O2 -Wall -pipe -g'
 | 
				
			||||||
 | 
					echo "CFLAGS=$CFLAGS"
 | 
				
			||||||
 | 
					echo "./configure $@"
 | 
				
			||||||
 | 
					./configure $@
 | 
				
			||||||
 | 
					unset CFLAGS
 | 
				
			||||||
 | 
					make
 | 
				
			||||||
| 
						 | 
					@ -1,34 +0,0 @@
 | 
				
			||||||
APPNAME = envy24control
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
desktopdir = $(datadir)/applications
 | 
					 | 
				
			||||||
desktop_DATA = $(APPNAME).desktop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public_icons = \
 | 
					 | 
				
			||||||
	hicolor_apps_48x48_$(APPNAME).png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST = \
 | 
					 | 
				
			||||||
	$(public_icons)		\
 | 
					 | 
				
			||||||
	$(desktop_DATA)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-icons:
 | 
					 | 
				
			||||||
	for icon in $(public_icons); do \
 | 
					 | 
				
			||||||
		THEME=`echo $$icon | cut -d_ -f1`; \
 | 
					 | 
				
			||||||
		CONTEXT=`echo $$icon | cut -d_ -f2`; \
 | 
					 | 
				
			||||||
		SIZE=`echo $$icon | cut -d_ -f3`; \
 | 
					 | 
				
			||||||
		ICONFILE=`echo $$icon | cut -d_ -f4`; \
 | 
					 | 
				
			||||||
		mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \
 | 
					 | 
				
			||||||
		$(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall-icons:
 | 
					 | 
				
			||||||
	-for icon in $(public_icons); do \
 | 
					 | 
				
			||||||
		THEME=`echo $$icon | cut -d_ -f1`; \
 | 
					 | 
				
			||||||
		CONTEXT=`echo $$icon | cut -d_ -f2`; \
 | 
					 | 
				
			||||||
		SIZE=`echo $$icon | cut -d_ -f3`; \
 | 
					 | 
				
			||||||
		ICONFILE=`echo $$icon | cut -d_ -f4`; \
 | 
					 | 
				
			||||||
		rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-local: install-icons
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall-local: uninstall-icons
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,10 +0,0 @@
 | 
				
			||||||
[Desktop Entry]
 | 
					 | 
				
			||||||
Name=Envy24 Control
 | 
					 | 
				
			||||||
GenericName=Envy24 Control Utility
 | 
					 | 
				
			||||||
Comment=Mixer and GUI control utility for Envy24-based sound cards
 | 
					 | 
				
			||||||
Exec=envy24control
 | 
					 | 
				
			||||||
Icon=envy24control
 | 
					 | 
				
			||||||
Terminal=false
 | 
					 | 
				
			||||||
Type=Application
 | 
					 | 
				
			||||||
Categories=AudioVideo;
 | 
					 | 
				
			||||||
Version=0.9.4
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 945 B  | 
| 
						 | 
					@ -14,12 +14,12 @@
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   You should have received a copy of the GNU General Public License
 | 
					   You should have received a copy of the GNU General Public License
 | 
				
			||||||
   along with this program; if not, write to the Free Software
 | 
					   along with this program; if not, write to the Free Software
 | 
				
			||||||
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
				
			||||||
******************************************************************************/
 | 
					******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "envy24control.h"
 | 
					#include "envy24control.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpointer data)
 | 
					void control_input_callback(gpointer data, gint source, GdkInputCondition condition)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	snd_ctl_t *ctl = (snd_ctl_t *)data;
 | 
						snd_ctl_t *ctl = (snd_ctl_t *)data;
 | 
				
			||||||
	snd_ctl_event_t *ev;
 | 
						snd_ctl_event_t *ev;
 | 
				
			||||||
| 
						 | 
					@ -29,12 +29,12 @@ gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpoi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	snd_ctl_event_alloca(&ev);
 | 
						snd_ctl_event_alloca(&ev);
 | 
				
			||||||
	if (snd_ctl_read(ctl, ev) < 0)
 | 
						if (snd_ctl_read(ctl, ev) < 0)
 | 
				
			||||||
		return TRUE;
 | 
							return;
 | 
				
			||||||
	name = snd_ctl_event_elem_get_name(ev);
 | 
						name = snd_ctl_event_elem_get_name(ev);
 | 
				
			||||||
	index = snd_ctl_event_elem_get_index(ev);
 | 
						index = snd_ctl_event_elem_get_index(ev);
 | 
				
			||||||
	mask = snd_ctl_event_elem_get_mask(ev);
 | 
						mask = snd_ctl_event_elem_get_mask(ev);
 | 
				
			||||||
	if (! (mask & (SND_CTL_EVENT_MASK_VALUE | SND_CTL_EVENT_MASK_INFO)))
 | 
						if (! (mask & (SND_CTL_EVENT_MASK_VALUE | SND_CTL_EVENT_MASK_INFO)))
 | 
				
			||||||
		return TRUE;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (snd_ctl_event_elem_get_interface(ev)) {
 | 
						switch (snd_ctl_event_elem_get_interface(ev)) {
 | 
				
			||||||
	case SND_CTL_ELEM_IFACE_MIXER:
 | 
						case SND_CTL_ELEM_IFACE_MIXER:
 | 
				
			||||||
| 
						 | 
					@ -81,13 +81,8 @@ gboolean control_input_callback(GIOChannel *source, GIOCondition condition, gpoi
 | 
				
			||||||
		else if (!strcmp(name, "Input Sensitivity Switch"))
 | 
							else if (!strcmp(name, "Input Sensitivity Switch"))
 | 
				
			||||||
			adc_sense_update(index);
 | 
								adc_sense_update(index);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SND_CTL_ELEM_IFACE_PCM:
 | 
					 | 
				
			||||||
		if (!strcmp(name, "IEC958 Playback Default"))
 | 
					 | 
				
			||||||
			spdif_output_update();
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -85,7 +85,7 @@ extern ice1712_eeprom_t card_eeprom;
 | 
				
			||||||
extern GtkWidget *mixer_mix_drawing;
 | 
					extern GtkWidget *mixer_mix_drawing;
 | 
				
			||||||
extern GtkWidget *mixer_clear_peaks_button;
 | 
					extern GtkWidget *mixer_clear_peaks_button;
 | 
				
			||||||
extern GtkWidget *mixer_drawing[20];
 | 
					extern GtkWidget *mixer_drawing[20];
 | 
				
			||||||
extern GtkAdjustment *mixer_adj[20][2];
 | 
					extern GtkObject *mixer_adj[20][2];
 | 
				
			||||||
extern GtkWidget *mixer_vscale[20][2];
 | 
					extern GtkWidget *mixer_vscale[20][2];
 | 
				
			||||||
extern GtkWidget *mixer_solo_toggle[20][2];
 | 
					extern GtkWidget *mixer_solo_toggle[20][2];
 | 
				
			||||||
extern GtkWidget *mixer_mute_toggle[20][2];
 | 
					extern GtkWidget *mixer_mute_toggle[20][2];
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ extern GtkWidget *hw_master_clock_actual_rate_label;
 | 
				
			||||||
extern GtkWidget *hw_rate_locking_check;
 | 
					extern GtkWidget *hw_rate_locking_check;
 | 
				
			||||||
extern GtkWidget *hw_rate_reset_check;
 | 
					extern GtkWidget *hw_rate_reset_check;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern GtkAdjustment *hw_volume_change_adj;
 | 
					extern GtkObject *hw_volume_change_adj;
 | 
				
			||||||
extern GtkWidget *hw_volume_change_spin;
 | 
					extern GtkWidget *hw_volume_change_spin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern GtkWidget *hw_spdif_profi_nonaudio_radio;
 | 
					extern GtkWidget *hw_spdif_profi_nonaudio_radio;
 | 
				
			||||||
| 
						 | 
					@ -151,9 +151,9 @@ extern GtkWidget *input_interface_internal;
 | 
				
			||||||
extern GtkWidget *input_interface_front_input;
 | 
					extern GtkWidget *input_interface_front_input;
 | 
				
			||||||
extern GtkWidget *input_interface_rear_input;
 | 
					extern GtkWidget *input_interface_rear_input;
 | 
				
			||||||
extern GtkWidget *input_interface_wavetable;
 | 
					extern GtkWidget *input_interface_wavetable;
 | 
				
			||||||
extern GtkAdjustment *av_dac_volume_adj[];
 | 
					extern GtkObject *av_dac_volume_adj[];
 | 
				
			||||||
extern GtkAdjustment *av_adc_volume_adj[];
 | 
					extern GtkObject *av_adc_volume_adj[];
 | 
				
			||||||
extern GtkAdjustment *av_ipga_volume_adj[];
 | 
					extern GtkObject *av_ipga_volume_adj[];
 | 
				
			||||||
extern GtkLabel *av_dac_volume_label[];
 | 
					extern GtkLabel *av_dac_volume_label[];
 | 
				
			||||||
extern GtkLabel *av_adc_volume_label[];
 | 
					extern GtkLabel *av_adc_volume_label[];
 | 
				
			||||||
extern GtkLabel *av_ipga_volume_label[];
 | 
					extern GtkLabel *av_ipga_volume_label[];
 | 
				
			||||||
| 
						 | 
					@ -163,7 +163,8 @@ extern GtkWidget *av_adc_sense_radio[][4];
 | 
				
			||||||
/* flags */
 | 
					/* flags */
 | 
				
			||||||
extern int card_is_dmx6fire;
 | 
					extern int card_is_dmx6fire;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean level_meters_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data);
 | 
					gint level_meters_configure_event(GtkWidget *widget, GdkEventConfigure *event);
 | 
				
			||||||
 | 
					gint level_meters_expose_event(GtkWidget *widget, GdkEventExpose *event);
 | 
				
			||||||
gint level_meters_timeout_callback(gpointer data);
 | 
					gint level_meters_timeout_callback(gpointer data);
 | 
				
			||||||
void level_meters_reset_peaks(GtkButton *button, gpointer data);
 | 
					void level_meters_reset_peaks(GtkButton *button, gpointer data);
 | 
				
			||||||
void level_meters_init(void);
 | 
					void level_meters_init(void);
 | 
				
			||||||
| 
						 | 
					@ -237,5 +238,6 @@ void ipga_volume_adjust(GtkAdjustment *adj, gpointer data);
 | 
				
			||||||
void dac_sense_toggled(GtkWidget *togglebutton, gpointer data);
 | 
					void dac_sense_toggled(GtkWidget *togglebutton, gpointer data);
 | 
				
			||||||
void adc_sense_toggled(GtkWidget *togglebutton, gpointer data);
 | 
					void adc_sense_toggled(GtkWidget *togglebutton, gpointer data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean control_input_callback(GIOChannel *gio, GIOCondition condition, gpointer data);
 | 
					void control_input_callback(gpointer data, gint source, GdkInputCondition condition);
 | 
				
			||||||
 | 
					void mixer_input_callback(gpointer data, gint source, GdkInputCondition condition);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   You should have received a copy of the GNU General Public License
 | 
					   You should have received a copy of the GNU General Public License
 | 
				
			||||||
   along with this program; if not, write to the Free Software
 | 
					   along with this program; if not, write to the Free Software
 | 
				
			||||||
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
				
			||||||
******************************************************************************/
 | 
					******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "envy24control.h"
 | 
					#include "envy24control.h"
 | 
				
			||||||
| 
						 | 
					@ -39,14 +39,7 @@ static inline int is_update_needed(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int is_active(GtkWidget *widget)
 | 
					static int is_active(GtkWidget *widget)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
 | 
						return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void label_set(GtkWidget* widget, const char* str)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	const char* old = gtk_label_get_text(GTK_LABEL(widget));
 | 
					 | 
				
			||||||
	if (strcmp(old, str))
 | 
					 | 
				
			||||||
		gtk_label_set_text(GTK_LABEL(widget), str);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void master_clock_update(void)
 | 
					void master_clock_update(void)
 | 
				
			||||||
| 
						 | 
					@ -177,8 +170,8 @@ gint master_clock_status_timeout_callback(gpointer data)
 | 
				
			||||||
	snd_ctl_elem_value_set_name(sw, "Word Clock Status");
 | 
						snd_ctl_elem_value_set_name(sw, "Word Clock Status");
 | 
				
			||||||
	if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
 | 
						if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
 | 
				
			||||||
		g_print("Unable to determine word clock status: %s\n", snd_strerror(err));
 | 
							g_print("Unable to determine word clock status: %s\n", snd_strerror(err));
 | 
				
			||||||
	label_set(hw_master_clock_status_label,
 | 
						gtk_label_set_text(GTK_LABEL(hw_master_clock_status_label),
 | 
				
			||||||
		  snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked");
 | 
								   snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked");
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,7 +246,7 @@ gint internal_clock_status_timeout_callback(gpointer data)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	label_set(hw_master_clock_actual_rate_label, label);
 | 
						gtk_label_set_text(GTK_LABEL(hw_master_clock_actual_rate_label), label);
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -361,7 +354,7 @@ void volume_change_rate_adj(GtkAdjustment *adj, gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	snd_ctl_elem_value_set_integer(volume_rate, 0, gtk_adjustment_get_value(adj));
 | 
						snd_ctl_elem_value_set_integer(volume_rate, 0, adj->value);
 | 
				
			||||||
	if ((err = snd_ctl_elem_write(ctl, volume_rate)) < 0)
 | 
						if ((err = snd_ctl_elem_write(ctl, volume_rate)) < 0)
 | 
				
			||||||
		g_print("Unable to write volume change rate: %s\n", snd_strerror(err));
 | 
							g_print("Unable to write volume change rate: %s\n", snd_strerror(err));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -462,9 +455,9 @@ void profi_stream_toggled(GtkWidget *togglebutton, gpointer data)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	iec958.status[1] &= ~IEC958_AES1_PRO_MODE;
 | 
						iec958.status[1] &= ~IEC958_AES1_PRO_MODE;
 | 
				
			||||||
	if (!strcmp(str, "NOTID")) {
 | 
						if (!strcmp(str, "NOTID")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_PRO_MODE_NOTID;
 | 
							iec958.status[0] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
 | 
				
			||||||
	} else if (!strcmp(str, "Stereo")) {
 | 
						} else if (!strcmp(str, "Stereo")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
 | 
							iec958.status[0] |= IEC958_AES1_PRO_MODE_NOTID;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
						snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
				
			||||||
	spdif_output_write();
 | 
						spdif_output_write();
 | 
				
			||||||
| 
						 | 
					@ -507,7 +500,7 @@ void consumer_copyright_toggled(GtkWidget *togglebutton, gpointer data)
 | 
				
			||||||
	if (!strcmp(str, "Copyright")) {
 | 
						if (!strcmp(str, "Copyright")) {
 | 
				
			||||||
		iec958.status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT;
 | 
							iec958.status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT;
 | 
				
			||||||
	} else if (!strcmp(str, "Permitted")) {
 | 
						} else if (!strcmp(str, "Permitted")) {
 | 
				
			||||||
		iec958.status[0] |= IEC958_AES0_CON_NOT_COPYRIGHT;
 | 
							iec958.status[1] |= IEC958_AES0_CON_NOT_COPYRIGHT;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
						snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
				
			||||||
	spdif_output_write();
 | 
						spdif_output_write();
 | 
				
			||||||
| 
						 | 
					@ -524,9 +517,9 @@ void consumer_copy_toggled(GtkWidget *togglebutton, gpointer data)
 | 
				
			||||||
	if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
 | 
						if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	if (!strcmp(str, "1st")) {
 | 
						if (!strcmp(str, "1st")) {
 | 
				
			||||||
		iec958.status[1] &= ~IEC958_AES1_CON_ORIGINAL;
 | 
							iec958.status[0] |= IEC958_AES1_CON_ORIGINAL;
 | 
				
			||||||
	} else if (!strcmp(str, "Original")) {
 | 
						} else if (!strcmp(str, "Original")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_CON_ORIGINAL;
 | 
							iec958.status[1] &= ~IEC958_AES1_CON_ORIGINAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
						snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
				
			||||||
	spdif_output_write();
 | 
						spdif_output_write();
 | 
				
			||||||
| 
						 | 
					@ -546,7 +539,7 @@ void consumer_emphasis_toggled(GtkWidget *togglebutton, gpointer data)
 | 
				
			||||||
	if (!strcmp(str, "No")) {
 | 
						if (!strcmp(str, "No")) {
 | 
				
			||||||
		iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_NONE;
 | 
							iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_NONE;
 | 
				
			||||||
	} else if (!strcmp(str, "5015")) {
 | 
						} else if (!strcmp(str, "5015")) {
 | 
				
			||||||
		iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_5015;
 | 
							iec958.status[1] |= ~IEC958_AES0_CON_EMPHASIS_5015;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
						snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
				
			||||||
	spdif_output_write();
 | 
						spdif_output_write();
 | 
				
			||||||
| 
						 | 
					@ -562,15 +555,15 @@ void consumer_category_toggled(GtkWidget *togglebutton, gpointer data)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
 | 
						if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	iec958.status[1] &= ~IEC958_AES1_CON_CATEGORY;
 | 
						iec958.status[0] &= ~IEC958_AES1_CON_CATEGORY;
 | 
				
			||||||
	if (!strcmp(str, "DAT")) {
 | 
						if (!strcmp(str, "DAT")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_CON_DAT;
 | 
							iec958.status[0] |= IEC958_AES1_CON_DAT;
 | 
				
			||||||
	} else if (!strcmp(str, "PCM")) {
 | 
						} else if (!strcmp(str, "PCM")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_CON_PCM_CODER;
 | 
							iec958.status[0] |= IEC958_AES1_CON_PCM_CODER;
 | 
				
			||||||
	} else if (!strcmp(str, "CD")) {
 | 
						} else if (!strcmp(str, "CD")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_CON_IEC908_CD;
 | 
							iec958.status[0] |= IEC958_AES1_CON_IEC908_CD;
 | 
				
			||||||
	} else if (!strcmp(str, "General")) {
 | 
						} else if (!strcmp(str, "General")) {
 | 
				
			||||||
		iec958.status[1] |= IEC958_AES1_CON_GENERAL;
 | 
							iec958.status[0] |= IEC958_AES1_CON_GENERAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
						snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
 | 
				
			||||||
	spdif_output_write();
 | 
						spdif_output_write();
 | 
				
			||||||
| 
						 | 
					@ -605,7 +598,7 @@ void spdif_output_toggled(GtkWidget *togglebutton, gpointer data)
 | 
				
			||||||
			page = 1;
 | 
								page = 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		spdif_output_write();
 | 
							spdif_output_write();
 | 
				
			||||||
		gtk_notebook_set_current_page(GTK_NOTEBOOK(hw_spdif_output_notebook), page);
 | 
							gtk_notebook_set_page(GTK_NOTEBOOK(hw_spdif_output_notebook), page);
 | 
				
			||||||
		spdif_output_update();
 | 
							spdif_output_update();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,18 +14,18 @@
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   You should have received a copy of the GNU General Public License
 | 
					   You should have received a copy of the GNU General Public License
 | 
				
			||||||
   along with this program; if not, write to the Free Software
 | 
					   along with this program; if not, write to the Free Software
 | 
				
			||||||
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
				
			||||||
******************************************************************************/
 | 
					******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "envy24control.h"
 | 
					#include "envy24control.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GdkRGBA *penGreenShadow = NULL;
 | 
					static GdkGC *penGreenShadow[21] = { NULL, };
 | 
				
			||||||
static GdkRGBA *penGreenLight = NULL;
 | 
					static GdkGC *penGreenLight[21] = { NULL, };
 | 
				
			||||||
static GdkRGBA *penOrangeShadow = NULL;
 | 
					static GdkGC *penOrangeShadow[21] = { NULL, };
 | 
				
			||||||
static GdkRGBA *penOrangeLight = NULL;
 | 
					static GdkGC *penOrangeLight[21] = { NULL, };
 | 
				
			||||||
static GdkRGBA *penRedShadow = NULL;
 | 
					static GdkGC *penRedShadow[21] = { NULL, };
 | 
				
			||||||
static GdkRGBA *penRedLight = NULL;
 | 
					static GdkGC *penRedLight[21] = { NULL, };
 | 
				
			||||||
static int level[22] = { 0 };
 | 
					static GdkPixmap *pixmap[21] = { NULL, };
 | 
				
			||||||
static snd_ctl_elem_value_t *peaks;
 | 
					static snd_ctl_elem_value_t *peaks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int input_channels, output_channels, pcm_output_channels, spdif_channels, view_spdif_playback;
 | 
					extern int input_channels, output_channels, pcm_output_channels, spdif_channels, view_spdif_playback;
 | 
				
			||||||
| 
						 | 
					@ -50,19 +50,22 @@ static void get_levels(int idx, int *l1, int *l2)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static GdkRGBA *get_pen(int nRed, int nGreen, int nBlue)
 | 
					static GdkGC *get_pen(int idx, int nRed, int nGreen, int nBlue)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	GdkRGBA *c;
 | 
						GdkColor *c;
 | 
				
			||||||
 | 
						GdkGC *gc;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	c = (GdkRGBA *)g_malloc(sizeof(GdkRGBA));
 | 
						c = (GdkColor *)g_malloc(sizeof(GdkColor));
 | 
				
			||||||
	c->red = nRed / 65535.0;
 | 
						c->red = nRed;
 | 
				
			||||||
	c->green = nGreen / 65535.0;
 | 
						c->green = nGreen;
 | 
				
			||||||
	c->blue = nBlue / 65535.0;
 | 
						c->blue = nBlue;
 | 
				
			||||||
	c->alpha = 1.0;
 | 
						gdk_color_alloc(gdk_colormap_get_system(), c);
 | 
				
			||||||
	return c;
 | 
						gc = gdk_gc_new(pixmap[idx]);
 | 
				
			||||||
 | 
						gdk_gc_set_foreground(gc, c);
 | 
				
			||||||
 | 
						return gc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int get_index(const gchar *name)
 | 
					static int get_index(gchar *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int result;
 | 
						int result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,7 +79,7 @@ static int get_index(const gchar *name)
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void redraw_meters(int idx, int width, int height, int level1, int level2, cairo_t *cr)
 | 
					static void redraw_meters(int idx, int width, int height, int level1, int level2)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int stereo = idx == 0;
 | 
						int stereo = idx == 0;
 | 
				
			||||||
	int segment_width = stereo ? (width / 2) - 8 : width - 12;
 | 
						int segment_width = stereo ? (width / 2) - 8 : width - 12;
 | 
				
			||||||
| 
						 | 
					@ -87,156 +90,167 @@ static void redraw_meters(int idx, int width, int height, int level1, int level2
 | 
				
			||||||
	int seg;
 | 
						int seg;
 | 
				
			||||||
	int segs_on1 = ((segments * level1) + 128) / 255;
 | 
						int segs_on1 = ((segments * level1) + 128) / 255;
 | 
				
			||||||
	int segs_on2 = ((segments * level2) + 128) / 255;
 | 
						int segs_on2 = ((segments * level2) + 128) / 255;
 | 
				
			||||||
	int end_seg;
 | 
					 | 
				
			||||||
	GdkRectangle clip;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// g_print("segs_on1 = %i (%i), segs_on2 = %i (%i)\n", segs_on1, level1, segs_on2, level2);
 | 
						// g_print("segs_on1 = %i (%i), segs_on2 = %i (%i)\n", segs_on1, level1, segs_on2, level2);
 | 
				
			||||||
	cairo_rectangle(cr, 0, 0, width, height);
 | 
						for (seg = 0; seg < green_segments; seg++) {
 | 
				
			||||||
	cairo_fill(cr);
 | 
							gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
 | 
									   segs_on1 > 0 ? penGreenLight[idx] : penGreenShadow[idx],
 | 
				
			||||||
	gdk_cairo_get_clip_rectangle(cr, &clip);
 | 
									   TRUE,
 | 
				
			||||||
	seg = segments - (clip.y + clip.height) / 4;
 | 
									   6, 3 + ((segments - seg - 1) * 4),
 | 
				
			||||||
	if (seg < 0)
 | 
									   segment_width,
 | 
				
			||||||
		seg = 0;
 | 
									   3);
 | 
				
			||||||
	segs_on1 -= seg;
 | 
							if (stereo)
 | 
				
			||||||
	segs_on2 -= seg;
 | 
								gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
	end_seg = segments - (clip.y - 2) / 4;
 | 
										   segs_on2 > 0 ? penGreenLight[idx] : penGreenShadow[idx],
 | 
				
			||||||
 | 
										   TRUE,
 | 
				
			||||||
	for (; seg < green_segments && seg < end_seg; seg++) {
 | 
										   2 + (width / 2),
 | 
				
			||||||
		gdk_cairo_set_source_rgba(cr,
 | 
										   3 + ((segments - seg - 1) * 4),
 | 
				
			||||||
					  segs_on1 > 0 ? penGreenLight : penGreenShadow);
 | 
										   segment_width,
 | 
				
			||||||
		cairo_rectangle(cr,
 | 
										   3);
 | 
				
			||||||
				6, 3 + ((segments - seg - 1) * 4),
 | 
					 | 
				
			||||||
				segment_width,
 | 
					 | 
				
			||||||
				3);
 | 
					 | 
				
			||||||
		cairo_fill(cr);
 | 
					 | 
				
			||||||
		if (stereo) {
 | 
					 | 
				
			||||||
			gdk_cairo_set_source_rgba(cr,
 | 
					 | 
				
			||||||
						  segs_on2 > 0 ? penGreenLight : penGreenShadow);
 | 
					 | 
				
			||||||
			cairo_rectangle(cr,
 | 
					 | 
				
			||||||
					2 + (width / 2),
 | 
					 | 
				
			||||||
					3 + ((segments - seg - 1) * 4),
 | 
					 | 
				
			||||||
					segment_width,
 | 
					 | 
				
			||||||
					3);
 | 
					 | 
				
			||||||
			cairo_fill(cr);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
		segs_on1--;
 | 
							segs_on1--;
 | 
				
			||||||
		segs_on2--;
 | 
							segs_on2--;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for (; seg < green_segments + orange_segments && seg < end_seg; seg++) {
 | 
						for (seg = green_segments; seg < green_segments + orange_segments; seg++) {
 | 
				
			||||||
		gdk_cairo_set_source_rgba(cr,
 | 
							gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
					  segs_on1 > 0 ? penOrangeLight : penOrangeShadow);
 | 
									   segs_on1 > 0 ? penOrangeLight[idx] : penOrangeShadow[idx],
 | 
				
			||||||
		cairo_rectangle(cr,
 | 
									   TRUE,
 | 
				
			||||||
				6, 3 + ((segments - seg - 1) * 4),
 | 
									   6, 3 + ((segments - seg - 1) * 4),
 | 
				
			||||||
				segment_width,
 | 
									   segment_width,
 | 
				
			||||||
				3);
 | 
									   3);
 | 
				
			||||||
		cairo_fill(cr);
 | 
							if (stereo)
 | 
				
			||||||
		if (stereo) {
 | 
								gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
			gdk_cairo_set_source_rgba(cr,
 | 
										   segs_on2 > 0 ? penOrangeLight[idx] : penOrangeShadow[idx],
 | 
				
			||||||
						  segs_on2 > 0 ? penOrangeLight : penOrangeShadow);
 | 
										   TRUE,
 | 
				
			||||||
			cairo_rectangle(cr,
 | 
										   2 + (width / 2),
 | 
				
			||||||
					2 + (width / 2),
 | 
										   3 + ((segments - seg - 1) * 4),
 | 
				
			||||||
					3 + ((segments - seg - 1) * 4),
 | 
										   segment_width,
 | 
				
			||||||
					segment_width,
 | 
										   3);
 | 
				
			||||||
					3);
 | 
					 | 
				
			||||||
			cairo_fill(cr);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		segs_on1--;
 | 
							segs_on1--;
 | 
				
			||||||
		segs_on2--;
 | 
							segs_on2--;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for (; seg < segments && seg < end_seg; seg++) {
 | 
						for (seg = green_segments + orange_segments; seg < segments; seg++) {
 | 
				
			||||||
		gdk_cairo_set_source_rgba(cr,
 | 
							gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
					  segs_on1 > 0 ? penRedLight : penRedShadow);
 | 
									   segs_on1 > 0 ? penRedLight[idx] : penRedShadow[idx],
 | 
				
			||||||
		cairo_rectangle(cr,
 | 
									   TRUE,
 | 
				
			||||||
				6, 3 + ((segments - seg - 1) * 4),
 | 
									   6, 3 + ((segments - seg - 1) * 4),
 | 
				
			||||||
				segment_width,
 | 
									   segment_width,
 | 
				
			||||||
				3);
 | 
									   3);
 | 
				
			||||||
		cairo_fill(cr);
 | 
							if (stereo)
 | 
				
			||||||
		if (stereo) {
 | 
								gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
			gdk_cairo_set_source_rgba(cr,
 | 
										   segs_on2 > 0 ? penRedLight[idx] : penRedShadow[idx],
 | 
				
			||||||
						  segs_on2 > 0 ? penRedLight : penRedShadow);
 | 
										   TRUE,
 | 
				
			||||||
			cairo_rectangle(cr,
 | 
										   2 + (width / 2),
 | 
				
			||||||
					2 + (width / 2),
 | 
										   3 + ((segments - seg - 1) * 4),
 | 
				
			||||||
					3 + ((segments - seg - 1) * 4),
 | 
										   segment_width,
 | 
				
			||||||
					segment_width,
 | 
										   3);
 | 
				
			||||||
					3);
 | 
					 | 
				
			||||||
			cairo_fill(cr);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		segs_on1--;
 | 
							segs_on1--;
 | 
				
			||||||
		segs_on2--;
 | 
							segs_on2--;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean level_meters_draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data)
 | 
					gint level_meters_configure_event(GtkWidget *widget, GdkEventConfigure *event)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int idx = get_index(gtk_widget_get_name(widget));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pixmap[idx] != NULL)
 | 
				
			||||||
 | 
							gdk_pixmap_unref(pixmap[idx]);
 | 
				
			||||||
 | 
						pixmap[idx] = gdk_pixmap_new(widget->window,
 | 
				
			||||||
 | 
									     widget->allocation.width,
 | 
				
			||||||
 | 
									     widget->allocation.height,
 | 
				
			||||||
 | 
									     -1);
 | 
				
			||||||
 | 
						penGreenShadow[idx] = get_pen(idx, 0, 0x77ff, 0);
 | 
				
			||||||
 | 
						penGreenLight[idx] = get_pen(idx, 0, 0xffff, 0);
 | 
				
			||||||
 | 
						penOrangeShadow[idx] = get_pen(idx, 0xddff, 0x55ff, 0);
 | 
				
			||||||
 | 
						penOrangeLight[idx] = get_pen(idx, 0xffff, 0x99ff, 0);
 | 
				
			||||||
 | 
						penRedShadow[idx] = get_pen(idx, 0xaaff, 0, 0);
 | 
				
			||||||
 | 
						penRedLight[idx] = get_pen(idx, 0xffff, 0, 0);
 | 
				
			||||||
 | 
						gdk_draw_rectangle(pixmap[idx],
 | 
				
			||||||
 | 
								   widget->style->black_gc,
 | 
				
			||||||
 | 
								   TRUE,
 | 
				
			||||||
 | 
								   0, 0,
 | 
				
			||||||
 | 
								   widget->allocation.width,
 | 
				
			||||||
 | 
								   widget->allocation.height);
 | 
				
			||||||
 | 
						// g_print("configure: %i:%i\n", widget->allocation.width, widget->allocation.height);
 | 
				
			||||||
 | 
						redraw_meters(idx, widget->allocation.width, widget->allocation.height, 0, 0);
 | 
				
			||||||
 | 
						return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gint level_meters_expose_event(GtkWidget *widget, GdkEventExpose *event)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int idx = get_index(gtk_widget_get_name(widget));
 | 
						int idx = get_index(gtk_widget_get_name(widget));
 | 
				
			||||||
	int l1, l2;
 | 
						int l1, l2;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	get_levels(idx, &l1, &l2);
 | 
						get_levels(idx, &l1, &l2);
 | 
				
			||||||
	redraw_meters(idx, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget), l1, l2, cr);
 | 
						redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
 | 
				
			||||||
 | 
						gdk_draw_pixmap(widget->window,
 | 
				
			||||||
 | 
								widget->style->black_gc,
 | 
				
			||||||
 | 
								pixmap[idx],
 | 
				
			||||||
 | 
								event->area.x, event->area.y,
 | 
				
			||||||
 | 
								event->area.x, event->area.y,
 | 
				
			||||||
 | 
								event->area.width, event->area.height);
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void update_meter(int idx)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int stereo = idx == 0;
 | 
					 | 
				
			||||||
	GtkWidget *widget = stereo ? mixer_mix_drawing : mixer_drawing[idx - 1];
 | 
					 | 
				
			||||||
	int width = gtk_widget_get_allocated_width(widget);
 | 
					 | 
				
			||||||
	int height = gtk_widget_get_allocated_height(widget);
 | 
					 | 
				
			||||||
	int segments = (height - 6) / 4;
 | 
					 | 
				
			||||||
	int level_idx = stereo ? 20 : idx - 1;
 | 
					 | 
				
			||||||
	int l1, l2, segs_on, old_segs_on, h;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	get_levels(idx, &l1, &l2);
 | 
					 | 
				
			||||||
	segs_on = ((segments * l1) + 128) / 255;
 | 
					 | 
				
			||||||
	old_segs_on = ((segments * level[level_idx]) + 128) / 255;
 | 
					 | 
				
			||||||
	h = abs(old_segs_on - segs_on);
 | 
					 | 
				
			||||||
	level[level_idx] = l1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (h > 0) {
 | 
					 | 
				
			||||||
		int y = segments - MAX(old_segs_on, segs_on);
 | 
					 | 
				
			||||||
		gtk_widget_queue_draw_area(widget,
 | 
					 | 
				
			||||||
					   6, 4 * y + 3,
 | 
					 | 
				
			||||||
					   stereo ? (width / 2) - 8 : width - 12,
 | 
					 | 
				
			||||||
					   4 * h - 1);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (stereo) {
 | 
					 | 
				
			||||||
		level_idx++;
 | 
					 | 
				
			||||||
		segs_on = ((segments * l2) + 128) / 255;
 | 
					 | 
				
			||||||
		old_segs_on = ((segments * level[level_idx]) + 128) / 255;
 | 
					 | 
				
			||||||
		h = abs(old_segs_on - segs_on);
 | 
					 | 
				
			||||||
		level[level_idx] = l2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (h > 0) {
 | 
					 | 
				
			||||||
			int y = segments - MAX(old_segs_on, segs_on);
 | 
					 | 
				
			||||||
			gtk_widget_queue_draw_area(widget,
 | 
					 | 
				
			||||||
						   2 + (width / 2), 4 * y + 3,
 | 
					 | 
				
			||||||
						   (width / 2) - 8,
 | 
					 | 
				
			||||||
						   4 * h - 1);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gint level_meters_timeout_callback(gpointer data)
 | 
					gint level_meters_timeout_callback(gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int idx;
 | 
						GtkWidget *widget;
 | 
				
			||||||
 | 
						int idx, l1, l2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	update_peak_switch();
 | 
						update_peak_switch();
 | 
				
			||||||
	for (idx = 0; idx <= pcm_output_channels; idx++) {
 | 
						for (idx = 0; idx <= pcm_output_channels; idx++) {
 | 
				
			||||||
		update_meter(idx);
 | 
							get_levels(idx, &l1, &l2);
 | 
				
			||||||
 | 
							widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
 | 
				
			||||||
 | 
							if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
 | 
				
			||||||
 | 
								redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
 | 
				
			||||||
 | 
								gdk_draw_pixmap(widget->window,
 | 
				
			||||||
 | 
										widget->style->black_gc,
 | 
				
			||||||
 | 
										pixmap[idx],
 | 
				
			||||||
 | 
										0, 0,
 | 
				
			||||||
 | 
										0, 0,
 | 
				
			||||||
 | 
										widget->allocation.width, widget->allocation.height);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (view_spdif_playback) {
 | 
						if (view_spdif_playback) {
 | 
				
			||||||
		for (idx = MAX_PCM_OUTPUT_CHANNELS + 1; idx <= MAX_OUTPUT_CHANNELS + spdif_channels; idx++) {
 | 
							for (idx = MAX_PCM_OUTPUT_CHANNELS + 1; idx <= MAX_OUTPUT_CHANNELS + spdif_channels; idx++) {
 | 
				
			||||||
			update_meter(idx);
 | 
								get_levels(idx, &l1, &l2);
 | 
				
			||||||
 | 
								widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
 | 
				
			||||||
 | 
								if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
 | 
				
			||||||
 | 
									redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
 | 
				
			||||||
 | 
									gdk_draw_pixmap(widget->window,
 | 
				
			||||||
 | 
											widget->style->black_gc,
 | 
				
			||||||
 | 
											pixmap[idx],
 | 
				
			||||||
 | 
											0, 0,
 | 
				
			||||||
 | 
											0, 0,
 | 
				
			||||||
 | 
											widget->allocation.width, widget->allocation.height);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1; idx <= input_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS; idx++) {
 | 
						for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1; idx <= input_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS; idx++) {
 | 
				
			||||||
		update_meter(idx);
 | 
							get_levels(idx, &l1, &l2);
 | 
				
			||||||
 | 
							widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
 | 
				
			||||||
 | 
							if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
 | 
				
			||||||
 | 
								redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
 | 
				
			||||||
 | 
								gdk_draw_pixmap(widget->window,
 | 
				
			||||||
 | 
										widget->style->black_gc,
 | 
				
			||||||
 | 
										pixmap[idx],
 | 
				
			||||||
 | 
										0, 0,
 | 
				
			||||||
 | 
										0, 0,
 | 
				
			||||||
 | 
										widget->allocation.width, widget->allocation.height);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS + 1; \
 | 
						for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS + 1; \
 | 
				
			||||||
		    idx <= spdif_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS; idx++) {
 | 
							    idx <= spdif_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS; idx++) {
 | 
				
			||||||
		update_meter(idx);
 | 
							get_levels(idx, &l1, &l2);
 | 
				
			||||||
 | 
							widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
 | 
				
			||||||
 | 
							if (GTK_WIDGET_VISIBLE(widget) && (pixmap[idx] != NULL)) {
 | 
				
			||||||
 | 
								redraw_meters(idx, widget->allocation.width, widget->allocation.height, l1, l2);
 | 
				
			||||||
 | 
								gdk_draw_pixmap(widget->window,
 | 
				
			||||||
 | 
										widget->style->black_gc,
 | 
				
			||||||
 | 
										pixmap[idx],
 | 
				
			||||||
 | 
										0, 0,
 | 
				
			||||||
 | 
										0, 0,
 | 
				
			||||||
 | 
										widget->allocation.width, widget->allocation.height);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -256,13 +270,6 @@ void level_meters_init(void)
 | 
				
			||||||
		/* older ALSA driver, using MIXER type */
 | 
							/* older ALSA driver, using MIXER type */
 | 
				
			||||||
		snd_ctl_elem_value_set_interface(peaks,
 | 
							snd_ctl_elem_value_set_interface(peaks,
 | 
				
			||||||
			SND_CTL_ELEM_IFACE_MIXER);
 | 
								SND_CTL_ELEM_IFACE_MIXER);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	penGreenShadow = get_pen(0, 0x77ff, 0);
 | 
					 | 
				
			||||||
	penGreenLight = get_pen(0, 0xffff, 0);
 | 
					 | 
				
			||||||
	penOrangeShadow = get_pen(0xddff, 0x55ff, 0);
 | 
					 | 
				
			||||||
	penOrangeLight = get_pen(0xffff, 0x99ff, 0);
 | 
					 | 
				
			||||||
	penRedShadow = get_pen(0xaaff, 0, 0);
 | 
					 | 
				
			||||||
	penRedLight = get_pen(0xffff, 0, 0);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void level_meters_postinit(void)
 | 
					void level_meters_postinit(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   You should have received a copy of the GNU General Public License
 | 
					   You should have received a copy of the GNU General Public License
 | 
				
			||||||
   along with this program; if not, write to the Free Software
 | 
					   along with this program; if not, write to the Free Software
 | 
				
			||||||
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
				
			||||||
******************************************************************************/
 | 
					******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
| 
						 | 
					@ -243,7 +243,7 @@ int midi_init(char *appname, int channel, int midi_enhanced)
 | 
				
			||||||
void mixer_adjust(GtkAdjustment *adj, gpointer data);
 | 
					void mixer_adjust(GtkAdjustment *adj, gpointer data);
 | 
				
			||||||
void mixer_set_mute(int stream, int left, int right);
 | 
					void mixer_set_mute(int stream, int left, int right);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data)
 | 
					void midi_process(gpointer data, gint source, GdkInputCondition condition)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  snd_seq_event_t *ev;
 | 
					  snd_seq_event_t *ev;
 | 
				
			||||||
  static GtkAdjustment *adj=0;
 | 
					  static GtkAdjustment *adj=0;
 | 
				
			||||||
| 
						 | 
					@ -306,7 +306,6 @@ gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data)
 | 
				
			||||||
      snd_seq_free_event(ev);
 | 
					      snd_seq_free_event(ev);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  while (snd_seq_event_input_pending(seq, 0) > 0);
 | 
					  while (snd_seq_event_input_pending(seq, 0) > 0);
 | 
				
			||||||
  return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ************************************************* */
 | 
					/* ************************************************* */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ int midi_init(char *appname, int channel, int midi_enhanced);
 | 
				
			||||||
int midi_close();
 | 
					int midi_close();
 | 
				
			||||||
void midi_maxstreams(int);
 | 
					void midi_maxstreams(int);
 | 
				
			||||||
int midi_controller(int c, int v);
 | 
					int midi_controller(int c, int v);
 | 
				
			||||||
gboolean midi_process(GIOChannel *gio, GIOCondition condition, gpointer data);
 | 
					void midi_process(gpointer data, gint source, GdkInputCondition condition);
 | 
				
			||||||
int midi_button(int b, int v);
 | 
					int midi_button(int b, int v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   You should have received a copy of the GNU General Public License
 | 
					   You should have received a copy of the GNU General Public License
 | 
				
			||||||
   along with this program; if not, write to the Free Software
 | 
					   along with this program; if not, write to the Free Software
 | 
				
			||||||
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
				
			||||||
******************************************************************************/
 | 
					******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "envy24control.h"
 | 
					#include "envy24control.h"
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ extern int input_channels, output_channels, pcm_output_channels, spdif_channels,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int is_active(GtkWidget *widget)
 | 
					static int is_active(GtkWidget *widget)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
 | 
						return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mixer_update_stream(int stream, int vol_flag, int sw_flag)
 | 
					void mixer_update_stream(int stream, int vol_flag, int sw_flag)
 | 
				
			||||||
| 
						 | 
					@ -181,10 +181,10 @@ void mixer_adjust(GtkAdjustment *adj, gpointer data)
 | 
				
			||||||
	int stereo = is_active(mixer_stereo_toggle[stream-1]) ? 1 : 0;
 | 
						int stereo = is_active(mixer_stereo_toggle[stream-1]) ? 1 : 0;
 | 
				
			||||||
	int vol[2] = { -1, -1 };
 | 
						int vol[2] = { -1, -1 };
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	vol[button] = 96 - gtk_adjustment_get_value(adj);
 | 
						vol[button] = 96 - adj->value;
 | 
				
			||||||
	if (stereo) {
 | 
						if (stereo) {
 | 
				
			||||||
		gtk_adjustment_set_value(GTK_ADJUSTMENT(mixer_adj[stream-1][button ^ 1]), gtk_adjustment_get_value(adj));
 | 
							gtk_adjustment_set_value(GTK_ADJUSTMENT(mixer_adj[stream-1][button ^ 1]), adj->value);
 | 
				
			||||||
		vol[button ^ 1] = 96 - gtk_adjustment_get_value(adj);
 | 
							vol[button ^ 1] = 96 - adj->value;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	set_volume1(stream, vol[0], vol[1]);
 | 
						set_volume1(stream, vol[0], vol[1]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,9 +20,9 @@ int new_process(char * const cmd_line[MAX_PARAM])
 | 
				
			||||||
	struct stat file_status;
 | 
						struct stat file_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* memory for storage of function pointers from the signal handling routines */
 | 
						/* memory for storage of function pointers from the signal handling routines */
 | 
				
			||||||
	void (*int_stat)(int);
 | 
						void (*int_stat)();
 | 
				
			||||||
	void (*quit_stat)(int);
 | 
						void (*quit_stat)();
 | 
				
			||||||
	void (*usr2_stat)(int);
 | 
						void (*usr2_stat)();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * check command file
 | 
						 * check command file
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
   You should have received a copy of the GNU General Public License
 | 
					   You should have received a copy of the GNU General Public License
 | 
				
			||||||
   along with this program; if not, write to the Free Software
 | 
					   along with this program; if not, write to the Free Software
 | 
				
			||||||
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
				
			||||||
******************************************************************************/
 | 
					******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "envy24control.h"
 | 
					#include "envy24control.h"
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ extern int output_channels, input_channels, pcm_output_channels, spdif_channels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int is_active(GtkWidget *widget)
 | 
					static int is_active(GtkWidget *widget)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? 1 : 0;
 | 
						return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int get_toggle_index(int stream)
 | 
					static int get_toggle_index(int stream)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   You should have received a copy of the GNU General Public License
 | 
					 *   You should have received a copy of the GNU General Public License
 | 
				
			||||||
 *   along with this program; if not, write to the Free Software
 | 
					 *   along with this program; if not, write to the Free Software
 | 
				
			||||||
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,9 +54,9 @@ void subst_tilde_in_filename(char * const filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((pos_after_tilde = strchr(filename, '~')) != NULL) {
 | 
						if ((pos_after_tilde = strchr(filename, '~')) != NULL) {
 | 
				
			||||||
		pos_after_tilde++;
 | 
							pos_after_tilde++;
 | 
				
			||||||
		strncpy(new_filename, getenv("HOME"), sizeof(new_filename) - 1);
 | 
							strncpy(new_filename, getenv("HOME"), MAX_FILE_NAME_LENGTH);
 | 
				
			||||||
		strncpy(new_filename + strlen(new_filename), pos_after_tilde, sizeof(new_filename) - strlen(new_filename) - 1);
 | 
							strncpy(new_filename + strlen(new_filename), pos_after_tilde, MAX_FILE_NAME_LENGTH - strlen(new_filename));
 | 
				
			||||||
		new_filename[sizeof(new_filename) - 1] = '\0';
 | 
							new_filename[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
				
			||||||
		strncpy(filename, new_filename, MAX_FILE_NAME_LENGTH);
 | 
							strncpy(filename, new_filename, MAX_FILE_NAME_LENGTH);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -78,9 +78,7 @@ int which_cfgfile(char ** const cfgfile)
 | 
				
			||||||
			   (inputFile = fopen(SYS_PROFILERC, "r")) == NULL) {
 | 
								   (inputFile = fopen(SYS_PROFILERC, "r")) == NULL) {
 | 
				
			||||||
			res = -ENOENT;
 | 
								res = -ENOENT;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if (inputFile != NULL) {
 | 
								fclose(inputFile);
 | 
				
			||||||
				fclose(inputFile);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			*cfgfile = SYS_PROFILERC;
 | 
								*cfgfile = SYS_PROFILERC;
 | 
				
			||||||
			res = EXIT_SUCCESS;
 | 
								res = EXIT_SUCCESS;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -96,9 +94,7 @@ int get_file_size(const char * const filename)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stat file_status;
 | 
						struct stat file_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (filename_without_tilde != filename) {
 | 
						strncpy(filename_without_tilde, filename, MAX_FILE_NAME_LENGTH);
 | 
				
			||||||
		strncpy(filename_without_tilde, filename, MAX_FILE_NAME_LENGTH);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	filename_without_tilde[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
						filename_without_tilde[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
				
			||||||
	subst_tilde_in_filename(filename_without_tilde);
 | 
						subst_tilde_in_filename(filename_without_tilde);
 | 
				
			||||||
	if (stat(filename_without_tilde, &file_status) < 0) {
 | 
						if (stat(filename_without_tilde, &file_status) < 0) {
 | 
				
			||||||
| 
						 | 
					@ -474,8 +470,7 @@ int get_pos_name_header_from_card(const char * const buffer, const int profile_n
 | 
				
			||||||
	char place_holder;
 | 
						char place_holder;
 | 
				
			||||||
	int pos_card_begin, pos_card_end, pos_name_header;
 | 
						int pos_card_begin, pos_card_end, pos_name_header;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((pos_card_begin = get_card_begin(buffer, profile_number, card_number)) < 0)
 | 
						pos_card_begin = get_card_begin(buffer, profile_number, card_number);
 | 
				
			||||||
		return pos_card_begin;
 | 
					 | 
				
			||||||
	pos_card_end = get_card_end(buffer, profile_number, card_number);
 | 
						pos_card_end = get_card_end(buffer, profile_number, card_number);
 | 
				
			||||||
	place_holder = PLACE_HOLDER_STR;
 | 
						place_holder = PLACE_HOLDER_STR;
 | 
				
			||||||
	strncpy(header, PROFILE_NAME_TEMPL, MAX_SEARCH_FIELD_LENGTH);
 | 
						strncpy(header, PROFILE_NAME_TEMPL, MAX_SEARCH_FIELD_LENGTH);
 | 
				
			||||||
| 
						 | 
					@ -527,7 +522,7 @@ int reorganize_profiles(char * const buffer, const int max_length)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int profile_number, card_number, card_number_max;
 | 
						int profile_number, card_number, card_number_max;
 | 
				
			||||||
	int res;
 | 
						int res;
 | 
				
			||||||
	int pos_profile_begin, pos_card_begin, pos_card_end, pos_name_header;
 | 
						int pos_profile_begin, pos_profile_end, pos_card_begin, pos_card_end, pos_name_header;
 | 
				
			||||||
	int pos_alsa_section_begin, pos_after_alsa_section;
 | 
						int pos_alsa_section_begin, pos_after_alsa_section;
 | 
				
			||||||
	char header[MAX_SEARCH_FIELD_LENGTH];
 | 
						char header[MAX_SEARCH_FIELD_LENGTH];
 | 
				
			||||||
	void *buffer_copy = NULL;
 | 
						void *buffer_copy = NULL;
 | 
				
			||||||
| 
						 | 
					@ -552,6 +547,7 @@ int reorganize_profiles(char * const buffer, const int max_length)
 | 
				
			||||||
		compose_search_string(header, PROFILE_HEADER_TEMPL, profile_or_card_number_as_str, place_holder, MAX_SEARCH_FIELD_LENGTH);
 | 
							compose_search_string(header, PROFILE_HEADER_TEMPL, profile_or_card_number_as_str, place_holder, MAX_SEARCH_FIELD_LENGTH);
 | 
				
			||||||
		header[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
 | 
							header[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
 | 
				
			||||||
		snprintf(buffer_copy + strlen(buffer_copy), max_length - strlen(buffer_copy), "%s\n", header);
 | 
							snprintf(buffer_copy + strlen(buffer_copy), max_length - strlen(buffer_copy), "%s\n", header);
 | 
				
			||||||
 | 
							pos_profile_end = get_profile_end(buffer, profile_number);
 | 
				
			||||||
		/* search max card number in profile */
 | 
							/* search max card number in profile */
 | 
				
			||||||
		card_number_max = get_max_card_number_in_profile(buffer, profile_number);
 | 
							card_number_max = get_max_card_number_in_profile(buffer, profile_number);
 | 
				
			||||||
		for (card_number = 0; card_number <= card_number_max; card_number++)
 | 
							for (card_number = 0; card_number <= card_number_max; card_number++)
 | 
				
			||||||
| 
						 | 
					@ -645,9 +641,9 @@ int save_restore_alsactl_settings(char * const tmpfile, const int card_number, c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void compose_tmpfile_name(char * const tmpfile, const char * const cfgfile)
 | 
					void compose_tmpfile_name(char * const tmpfile, const char * const cfgfile)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	strncpy(tmpfile, cfgfile, MAX_FILE_NAME_LENGTH - 1);
 | 
						strncpy(tmpfile, cfgfile, MAX_FILE_NAME_LENGTH);
 | 
				
			||||||
	tmpfile[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
						tmpfile[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
				
			||||||
	strncpy(tmpfile + strlen(tmpfile), "_alsactl_tmp", MAX_FILE_NAME_LENGTH - strlen(tmpfile) - 1);
 | 
						strncpy(tmpfile + strlen(tmpfile), "_alsactl_tmp", MAX_FILE_NAME_LENGTH - strlen(tmpfile));
 | 
				
			||||||
	tmpfile[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
						tmpfile[MAX_FILE_NAME_LENGTH - 1] = '\0';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1149,16 +1145,13 @@ int save_restore(const char * const operation, const int profile_number, const i
 | 
				
			||||||
				fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
 | 
									fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
 | 
				
			||||||
				return -errno;
 | 
									return -errno;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			close(res);
 | 
					 | 
				
			||||||
			unlink(cfgfile);
 | 
								unlink(cfgfile);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			close(res);
 | 
					 | 
				
			||||||
			if ((res = open(cfgfile, O_RDWR | 0400000 /* O_NOFOLLOW */, FILE_CREA_MODE)) < 0) {
 | 
								if ((res = open(cfgfile, O_RDWR | 0400000 /* O_NOFOLLOW */, FILE_CREA_MODE)) < 0) {
 | 
				
			||||||
				fprintf(stderr, "Cannot open configuration file '%s' for writing.\n", cfgfile);
 | 
									fprintf(stderr, "Cannot open configuration file '%s' for writing.\n", cfgfile);
 | 
				
			||||||
				fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
 | 
									fprintf(stderr, "Cannot save settings for card '%d' in profile '%d'.\n", card_number, profile_number);
 | 
				
			||||||
				return -errno;
 | 
									return -errno;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			close(res);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		res =  save_profile(profile_number, card_number, profile_name, cfgfile);
 | 
							res =  save_profile(profile_number, card_number, profile_name, cfgfile);
 | 
				
			||||||
	} else if (!strcmp(operation, ALSACTL_OP_RESTORE)) {
 | 
						} else if (!strcmp(operation, ALSACTL_OP_RESTORE)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@
 | 
				
			||||||
#define MAX_PROFILE_SIZE 32768
 | 
					#define MAX_PROFILE_SIZE 32768
 | 
				
			||||||
#define MAX_SEARCH_FIELD_LENGTH 1024
 | 
					#define MAX_SEARCH_FIELD_LENGTH 1024
 | 
				
			||||||
#define MAX_FILE_NAME_LENGTH 1024
 | 
					#define MAX_FILE_NAME_LENGTH 1024
 | 
				
			||||||
#define MAX_NUM_STR_LENGTH 11
 | 
					#define MAX_NUM_STR_LENGTH 10
 | 
				
			||||||
#define TOKEN_SEP "|"
 | 
					#define TOKEN_SEP "|"
 | 
				
			||||||
#define SEP_CHAR ' '
 | 
					#define SEP_CHAR ' '
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   You should have received a copy of the GNU General Public License
 | 
					 *   You should have received a copy of the GNU General Public License
 | 
				
			||||||
 *   along with this program; if not, write to the Free Software
 | 
					 *   along with this program; if not, write to the Free Software
 | 
				
			||||||
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,6 @@ int strstr_icase_blank(const char * const string1, const char * const string2)
 | 
				
			||||||
	char search_string[MAX_SEARCH_FIELD_LENGTH];
 | 
						char search_string[MAX_SEARCH_FIELD_LENGTH];
 | 
				
			||||||
	char *pstr;
 | 
						char *pstr;
 | 
				
			||||||
	int pos_first_non_blank;
 | 
						int pos_first_non_blank;
 | 
				
			||||||
	size_t len;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strncpy(search_string, string2, MAX_SEARCH_FIELD_LENGTH);
 | 
						strncpy(search_string, string2, MAX_SEARCH_FIELD_LENGTH);
 | 
				
			||||||
	search_string[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
 | 
						search_string[MAX_SEARCH_FIELD_LENGTH - 1] = '\0';
 | 
				
			||||||
| 
						 | 
					@ -85,11 +84,7 @@ int strstr_icase_blank(const char * const string1, const char * const string2)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	len = strlen(search_string);
 | 
						strncpy(search_string, cmp_line, strlen(search_string));
 | 
				
			||||||
	if (len > sizeof(search_string) - 1)
 | 
					 | 
				
			||||||
		len = sizeof(search_string) - 1;
 | 
					 | 
				
			||||||
	strncpy(search_string, cmp_line, len);
 | 
					 | 
				
			||||||
	search_string[len] = '\0';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	position = 0;
 | 
						position = 0;
 | 
				
			||||||
	while (position < strlen(string1))
 | 
						while (position < strlen(string1))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *   You should have received a copy of the GNU General Public License
 | 
					 *   You should have received a copy of the GNU General Public License
 | 
				
			||||||
 *   along with this program; if not, write to the Free Software
 | 
					 *   along with this program; if not, write to the Free Software
 | 
				
			||||||
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
					 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "envy24control.h"
 | 
					#include "envy24control.h"
 | 
				
			||||||
| 
						 | 
					@ -217,7 +217,7 @@ void dac_volume_adjust(GtkAdjustment *adj, gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int idx = (int)(long)data;
 | 
						int idx = (int)(long)data;
 | 
				
			||||||
	snd_ctl_elem_value_t *val;
 | 
						snd_ctl_elem_value_t *val;
 | 
				
			||||||
	int err, ival = -(int)gtk_adjustment_get_value(adj);
 | 
						int err, ival = -(int)adj->value;
 | 
				
			||||||
	char text[16];
 | 
						char text[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	snd_ctl_elem_value_alloca(&val);
 | 
						snd_ctl_elem_value_alloca(&val);
 | 
				
			||||||
| 
						 | 
					@ -235,7 +235,7 @@ void adc_volume_adjust(GtkAdjustment *adj, gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int idx = (int)(long)data;
 | 
						int idx = (int)(long)data;
 | 
				
			||||||
	snd_ctl_elem_value_t *val;
 | 
						snd_ctl_elem_value_t *val;
 | 
				
			||||||
	int err, ival = -(int)gtk_adjustment_get_value(adj);
 | 
						int err, ival = -(int)adj->value;
 | 
				
			||||||
	char text[16];
 | 
						char text[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	snd_ctl_elem_value_alloca(&val);
 | 
						snd_ctl_elem_value_alloca(&val);
 | 
				
			||||||
| 
						 | 
					@ -253,7 +253,7 @@ void ipga_volume_adjust(GtkAdjustment *adj, gpointer data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int idx = (int)(long)data;
 | 
						int idx = (int)(long)data;
 | 
				
			||||||
	snd_ctl_elem_value_t *val;
 | 
						snd_ctl_elem_value_t *val;
 | 
				
			||||||
	int err, ival = -(int)gtk_adjustment_get_value(adj);
 | 
						int err, ival = -(int)adj->value;
 | 
				
			||||||
	char text[16];
 | 
						char text[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	snd_ctl_elem_value_alloca(&val);
 | 
						snd_ctl_elem_value_alloca(&val);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +0,0 @@
 | 
				
			||||||
version 0.3:
 | 
					 | 
				
			||||||
 - Add -l and -L option to show defined verbs and parameters
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version 0.3:
 | 
					 | 
				
			||||||
 - Add a brief description about hwdep in README
 | 
					 | 
				
			||||||
 - Add COPYING before someone blaming me
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version 0.2
 | 
					 | 
				
			||||||
 - public release
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
version 0.1
 | 
					 | 
				
			||||||
 - embryo
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,13 +0,0 @@
 | 
				
			||||||
MYNAME = hda-verb
 | 
					 | 
				
			||||||
AUTOMAKE_OPTIONS = 1.3 foreign
 | 
					 | 
				
			||||||
bin_PROGRAMS = hda-verb
 | 
					 | 
				
			||||||
hda_verb_SOURCES = hda-verb.c
 | 
					 | 
				
			||||||
noinst_HEADERS = hda_hwdep.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST = gitcompile README ChangeLog
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
alsa-dist: distdir
 | 
					 | 
				
			||||||
	@rm -rf ../distdir/$(MYNAME)
 | 
					 | 
				
			||||||
	@mkdir -p ../distdir/$(MYNAME)
 | 
					 | 
				
			||||||
	@cp -RLpv $(distdir)/* ../distdir/$(MYNAME)
 | 
					 | 
				
			||||||
	@rm -rf $(distdir)
 | 
					 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue