├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── import-summary.txt
├── library
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── czt
│ │ └── mp3recorder
│ │ ├── DataEncodeThread.java
│ │ ├── MP3Recorder.java
│ │ ├── PCMFormat.java
│ │ ├── RecordExceptionListener.java
│ │ └── util
│ │ └── LameUtil.java
│ ├── jni
│ ├── Android.mk
│ ├── Application.mk
│ ├── com_czt_mp3recorder_util_LameUtil.h
│ ├── lame_3.99.5_libmp3lame
│ │ ├── VbrTag.c
│ │ ├── VbrTag.h
│ │ ├── bitstream.c
│ │ ├── bitstream.h
│ │ ├── encoder.c
│ │ ├── encoder.h
│ │ ├── fft.c
│ │ ├── fft.h
│ │ ├── gain_analysis.c
│ │ ├── gain_analysis.h
│ │ ├── i386
│ │ │ └── nasm.h
│ │ ├── id3tag.c
│ │ ├── id3tag.h
│ │ ├── l3side.h
│ │ ├── lame-analysis.h
│ │ ├── lame.c
│ │ ├── lame.h
│ │ ├── lame_global_flags.h
│ │ ├── lameerror.h
│ │ ├── machine.h
│ │ ├── mpglib_interface.c
│ │ ├── newmdct.c
│ │ ├── newmdct.h
│ │ ├── presets.c
│ │ ├── psymodel.c
│ │ ├── psymodel.h
│ │ ├── quantize.c
│ │ ├── quantize.h
│ │ ├── quantize_pvt.c
│ │ ├── quantize_pvt.h
│ │ ├── reservoir.c
│ │ ├── reservoir.h
│ │ ├── set_get.c
│ │ ├── set_get.h
│ │ ├── tables.c
│ │ ├── tables.h
│ │ ├── takehiro.c
│ │ ├── util.c
│ │ ├── util.h
│ │ ├── vbrquantize.c
│ │ ├── vbrquantize.h
│ │ ├── vector
│ │ │ ├── lame_intrin.h
│ │ │ └── xmm_quantize_sub.c
│ │ ├── version.c
│ │ └── version.h
│ └── lame_util.c
│ └── jniLibs
│ ├── arm64-v8a
│ └── libmp3lame.so
│ ├── armeabi-v7a
│ └── libmp3lame.so
│ ├── armeabi
│ └── libmp3lame.so
│ ├── mips
│ └── libmp3lame.so
│ ├── mips64
│ └── libmp3lame.so
│ ├── x86
│ └── libmp3lame.so
│ └── x86_64
│ └── libmp3lame.so
├── sample
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── czt
│ │ └── mp3recorder
│ │ └── sample
│ │ └── MainActivity.java
│ └── res
│ ├── drawable-hdpi
│ └── ic_launcher.png
│ ├── drawable-mdpi
│ └── ic_launcher.png
│ ├── drawable-xhdpi
│ └── ic_launcher.png
│ ├── drawable-xxhdpi
│ └── ic_launcher.png
│ ├── layout
│ └── main.xml
│ └── values
│ └── strings.xml
└── settings.gradle
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 | *.sln merge=union
7 | *.csproj merge=union
8 | *.vbproj merge=union
9 | *.fsproj merge=union
10 | *.dbproj merge=union
11 |
12 | # Standard to msysgit
13 | *.doc diff=astextplain
14 | *.DOC diff=astextplain
15 | *.docx diff=astextplain
16 | *.DOCX diff=astextplain
17 | *.dot diff=astextplain
18 | *.DOT diff=astextplain
19 | *.pdf diff=astextplain
20 | *.PDF diff=astextplain
21 | *.rtf diff=astextplain
22 | *.RTF diff=astextplain
23 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Built application files
2 | *.apk
3 | *.ap_
4 |
5 | # Files for the Dalvik VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # Generated files
12 | bin/
13 | gen/
14 |
15 | # Gradle files
16 | .gradle/
17 | build/
18 |
19 | # IntelliJ User-specific configurations
20 | .idea/
21 | *.iml
22 |
23 | # Eclipse User-specific configurations
24 | .project
25 | .classpath
26 | .settings/
27 |
28 | # Local configuration file (sdk path, etc)
29 | local.properties
30 |
31 | # Proguard folder generated by Eclipse
32 | proguard/
33 |
34 | # =========================
35 | # Operating System Files
36 | # =========================
37 |
38 | # OSX
39 | # =========================
40 |
41 | .DS_Store
42 | .AppleDouble
43 | .LSOverride
44 |
45 | # Icon must ends with two \r.
46 | Icon
47 |
48 | # Thumbnails
49 | ._*
50 |
51 | # Files that might appear on external disk
52 | .Spotlight-V100
53 | .Trashes
54 |
55 | # Windows
56 | # =========================
57 |
58 | # Windows image file caches
59 | Thumbs.db
60 | ehthumbs.db
61 |
62 | # Folder config file
63 | Desktop.ini
64 |
65 | # Recycle Bin used on file shares
66 | $RECYCLE.BIN/
67 |
68 | # Windows Installer files
69 | *.cab
70 | *.msi
71 | *.msm
72 | *.msp
73 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
203 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | AndroidMP3Recorder
2 | ==================
3 | # 项目介绍
4 | 本项目Fork自[AndroidMP3Recorder](https://github.com/GavinCT/AndroidMP3Recorder),由于原作者停止维护,此项目是我fork下主分支来维护的。相比原项目,此项目支持以下功能:
5 |
6 | 1. 修复部分机型空指针异常导致Crash的bug
7 | 2. 支持自定义输出码率
8 | 3. 支持获取实时分贝
9 | 4. 支持设置最大录音时间限制
10 | 5. 支持错误异常监听,出错时可以根据需求及时反馈
11 |
12 | # 实现思路讲解
13 | 实现思路讲解:[Android MP3录音实现](http://www.cnblogs.com/ct2011/p/4080193.html)
14 |
15 | ---
16 |
17 | 为Android提供MP3录音功能
18 |
19 | 实现思路讲解:[Android MP3录音实现](http://www.cnblogs.com/ct2011/p/4080193.html)
20 |
21 | # 1. 目录简介
22 |
23 | - library: MP3录音实现源码库
24 | - sample : 使用范例
25 |
26 | # 2. 使用方法
27 | ## 集成到项目中
28 |
29 | ```Groovy
30 | dependencies {
31 | compile 'com.github.Jay-Goo:AndroidMP3Recorder:v1.0.7'
32 | }
33 | ```
34 |
35 | ## 录音功能实现
36 | 1. 创建MP3Recorder, 传入录音文件的File对象。
37 |
38 | ```java
39 | MP3Recorder mRecorder = new MP3Recorder(new File(Environment.getExternalStorageDirectory(),"test.mp3"));
40 | ```
41 | 2. 开始录音: 调用MP3Recorder对象的start()方法。
42 |
43 | ```java
44 | mRecorder.start();
45 | ```
46 | 3. 停止录音: 调用MP3Recorder对象的stop()方法。
47 |
48 | ```java
49 | mRecorder.stop();
50 | ```
51 | 4. 获取实时分贝:
52 |
53 | ```java
54 | mRecorder.getVlumeDb();
55 | ```
56 | 5. 设置最大录音时长: 默认不限制。
57 |
58 | ```java
59 | mRecorder.setMaxRecordTime(60 * 1000);
60 | ```
61 | 6. 获取实时分贝:
62 |
63 | ```java
64 | mRecorder.getVlumeDb();
65 | ```
66 | 7. 异常监听:当程序异常时,我们需要知道**注意,这里的回调并不一定在UI线程里**
67 |
68 | ```java
69 | mRecorder.setRecordExceptionListener(new RecordExceptionListener() {
70 | @Override
71 | public void onError(Throwable e) {
72 |
73 | });
74 | }
75 | });
76 | ```
77 |
78 | 代码示例见:Sample
79 | # 3. 关于音量部分的解释
80 | ~~音量的计算,来自于 [三星开发者文档-Displaying Sound Volume in Real-Time While Recording](http://developer.samsung.com/technical-doc/view.do?v=T000000086)
81 | 里面对于音量的最大值设置为了4000,而我实际测验中发现大部分声音不超过2000,所以就在代码中暂时设置为2000。
82 | 这方面没有找到相关资料,如果有人知道理论值之类的,请联系我(1015121748@qq.com) 完善此库,谢谢。
83 |
84 | # 4. 关于so库的声明
85 | so库本身没有任何限制,但受限于Android NDK的支持
86 | - arm armv7 支持Android 1.5 (API Level 3)及以上版本
87 | - x86支持Android 2.3 (API Level 9)及以上版本
88 |
89 | # 5. 常见问题声明
90 |
91 | ## 使用so中的部分
92 |
93 | 本库提供了 arm mips x86 等多种so,如果您只需要其中的几种,可以在gradle中添加下面的语法:
94 |
95 | ```groovy
96 | productFlavors {
97 | arm {
98 | ndk {
99 | abiFilters "armeabi-v7a", "armeabi"
100 | }
101 | }
102 | x86 {
103 | ndk {
104 | abiFilter "x86"
105 | }
106 | }
107 | }
108 | ```
109 |
110 | 以上会在arm中接入armv7 arm包,最新的64位v8不会放入。 同时没有提供mips的flavor,也保证了没有mips的so。但最新的1.5.0插件不支持这种写法,且新版的ndk还处于试验阶段,所以一般使用了上述写法会报错,报错中给出了提示,即在gradle.properties中添加
111 |
112 | ```
113 | android.useDeprecatedNdk=true
114 | ```
115 |
116 | 即可正常使用
117 |
118 | ## 遇到了 java.lang.UnsatisfiedLinkError错误
119 |
120 | 这种情况一般是so不全导致的。
121 |
122 | 以app使用了百度地图sdk为例:
123 |
124 | 假如百度地图只提供了arm 的so , 您使用了本库后会有arm armv7 armv8等多种库,这样打包后会产生armeabi、armeabi-v7a、armeabi-v8a等多个文件夹,但百度地图在armv7 v8下并没有so,这样就会引发`java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapSDK_v3_2_0_15 from loader`错误。
125 |
126 | 解决办法有两种:
127 |
128 | - 联系其他库的提供者补全
129 | - 如果不行的话,可以利用上面提到的abiFilters来过滤掉本库的so,这样只提供arm一般是可以兼容的。
130 |
131 |
132 | # 6. License
133 |
134 | Copyright 2014 GavinCT
135 |
136 | Licensed under the Apache License, Version 2.0 (the "License");
137 | you may not use this file except in compliance with the License.
138 | You may obtain a copy of the License at
139 |
140 | http://www.apache.org/licenses/LICENSE-2.0
141 |
142 | Unless required by applicable law or agreed to in writing, software
143 | distributed under the License is distributed on an "AS IS" BASIS,
144 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145 | See the License for the specific language governing permissions and
146 | limitations under the License.
147 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | buildscript {
3 | repositories {
4 | jcenter()
5 | }
6 | dependencies {
7 | classpath 'com.android.tools.build:gradle:2.1.0'
8 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
9 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
10 | }
11 | }
12 |
13 | allprojects {
14 | repositories {
15 | jcenter()
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu May 12 11:08:54 CST 2016
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/import-summary.txt:
--------------------------------------------------------------------------------
1 | ECLIPSE ANDROID PROJECT IMPORT SUMMARY
2 | ======================================
3 |
4 | Manifest Merging:
5 | -----------------
6 | Your project uses libraries that provide manifests, and your Eclipse
7 | project did not explicitly turn on manifest merging. In Android Gradle
8 | projects, manifests are always merged (meaning that contents from your
9 | libraries' manifests will be merged into the app manifest. If you had
10 | manually copied contents from library manifests into your app manifest
11 | you may need to remove these for the app to build correctly.
12 |
13 | Ignored Files:
14 | --------------
15 | The following files were *not* copied into the new Gradle project; you
16 | should evaluate whether these are still needed in your project and if
17 | so manually move them:
18 |
19 | From AndroidMP3RecorderLibrary:
20 | * proguard-project.txt
21 | From AndroidMP3RecorderSample:
22 | * proguard-project.txt
23 |
24 | Replaced Jars with Dependencies:
25 | --------------------------------
26 | The importer recognized the following .jar files as third party
27 | libraries and replaced them with Gradle dependencies instead. This has
28 | the advantage that more explicit version information is known, and the
29 | libraries can be updated automatically. However, it is possible that
30 | the .jar file in your project was of an older version than the
31 | dependency we picked, which could render the project not compileable.
32 | You can disable the jar replacement in the import wizard and try again:
33 |
34 | android-support-v4.jar => com.android.support:support-v4:21.0.3
35 |
36 | Moved Files:
37 | ------------
38 | Android Gradle projects use a different directory structure than ADT
39 | Eclipse projects. Here's how the projects were restructured:
40 |
41 | In AndroidMP3RecorderLibrary:
42 | * AndroidManifest.xml => AndroidMP3RecorderLibrary\src\main\AndroidManifest.xml
43 | * jni\ => AndroidMP3RecorderLibrary\src\main\jni\
44 | * res\ => AndroidMP3RecorderLibrary\src\main\res\
45 | * src\ => AndroidMP3RecorderLibrary\src\main\java\
46 | In AndroidMP3RecorderSample:
47 | * AndroidManifest.xml => AndroidMP3RecorderSample\src\main\AndroidManifest.xml
48 | * res\ => AndroidMP3RecorderSample\src\main\res\
49 | * src\ => AndroidMP3RecorderSample\src\main\java\
50 |
51 | Next Steps:
52 | -----------
53 | You can now build the project. The Gradle project needs network
54 | connectivity to download dependencies.
55 |
56 | Bugs:
57 | -----
58 | If for some reason your project does not build, and you determine that
59 | it is due to a bug or limitation of the Eclipse to Gradle importer,
60 | please file a bug at http://b.android.com with category
61 | Component-Tools.
62 |
63 | (This import summary is for your information only, and can be deleted
64 | after import once you are satisfied with the results.)
65 |
--------------------------------------------------------------------------------
/library/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'com.github.dcendents.android-maven'
3 | apply plugin: 'com.jfrog.bintray'
4 | version = "1.0.4"
5 | android {
6 | compileSdkVersion 23
7 | buildToolsVersion "23.0.2"
8 | resourcePrefix "AndroidMP3RecorderLibrary_" //这个随便填
9 | defaultConfig {
10 | minSdkVersion 9
11 | targetSdkVersion 23
12 | }
13 |
14 | sourceSets.main {
15 | jni.srcDirs = [] // This prevents the auto generation of Android.mk
16 | jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
17 | }
18 |
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
23 | }
24 | }
25 | }
26 |
27 | dependencies {
28 | compile 'com.android.support:support-v4:23.1.1'
29 | }
30 |
31 | def siteUrl = 'https://github.com/GavinCT/AndroidMP3Recorder' // 项目的主页
32 | def gitUrl = 'https://github.com/GavinCT/AndroidMP3Recorder.git' // Git仓库的url
33 | group = "com.czt.mp3recorder" // Maven Group ID for the artifact,一般填你唯一的包名
34 | install {
35 | repositories.mavenInstaller {
36 | // This generates POM.xml with proper parameters
37 | pom {
38 | project {
39 | packaging 'aar'
40 | // Add your description here
41 | name 'Android MP3 Recorder Library' //项目描述
42 | url siteUrl
43 | // Set your license
44 | licenses {
45 | license {
46 | name 'The Apache Software License, Version 2.0'
47 | url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
48 | }
49 | }
50 | developers {
51 | developer {
52 | id 'GavinCT' //填写的一些基本信息
53 | name 'chentong'
54 | email 'chentong.think@gmail.com'
55 | }
56 | }
57 | scm {
58 | connection gitUrl
59 | developerConnection gitUrl
60 | url siteUrl
61 | }
62 | }
63 | }
64 | }
65 | }
66 | task sourcesJar(type: Jar) {
67 | from android.sourceSets.main.java.srcDirs
68 | classifier = 'sources'
69 | }
70 | task javadoc(type: Javadoc) {
71 | source = android.sourceSets.main.java.srcDirs
72 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
73 | options.encoding = "UTF-8"
74 | }
75 | task javadocJar(type: Jar, dependsOn: javadoc) {
76 | classifier = 'javadoc'
77 | from javadoc.destinationDir
78 | }
79 | artifacts {
80 | archives javadocJar
81 | archives sourcesJar
82 | }
83 | Properties properties = new Properties()
84 | properties.load(project.rootProject.file('local.properties').newDataInputStream())
85 | bintray {
86 | user = properties.getProperty("bintray.user")
87 | key = properties.getProperty("bintray.apikey")
88 | configurations = ['archives']
89 | pkg {
90 | repo = "maven"
91 | name = "AndroidMP3RecorderLibrary" //发布到JCenter上的项目名字
92 | websiteUrl = siteUrl
93 | vcsUrl = gitUrl
94 | licenses = ["Apache-2.0"]
95 | publish = true
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/library/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/library/src/main/java/com/czt/mp3recorder/DataEncodeThread.java:
--------------------------------------------------------------------------------
1 | package com.czt.mp3recorder;
2 |
3 | import android.media.AudioRecord;
4 | import android.os.Handler;
5 | import android.os.HandlerThread;
6 | import android.os.Looper;
7 | import android.os.Message;
8 |
9 | import com.czt.mp3recorder.util.LameUtil;
10 |
11 | import java.io.File;
12 | import java.io.FileNotFoundException;
13 | import java.io.FileOutputStream;
14 | import java.io.IOException;
15 | import java.util.ArrayList;
16 | import java.util.Collections;
17 | import java.util.List;
18 |
19 | public class DataEncodeThread extends HandlerThread implements AudioRecord.OnRecordPositionUpdateListener {
20 | private StopHandler mHandler;
21 | private static final int PROCESS_STOP = 1;
22 | private byte[] mMp3Buffer;
23 | private FileOutputStream mFileOutputStream;
24 |
25 | private static class StopHandler extends Handler {
26 |
27 | private DataEncodeThread encodeThread;
28 |
29 | public StopHandler(Looper looper, DataEncodeThread encodeThread) {
30 | super(looper);
31 | this.encodeThread = encodeThread;
32 | }
33 |
34 | @Override
35 | public void handleMessage(Message msg) {
36 | if (msg.what == PROCESS_STOP) {
37 | //处理缓冲区中的数据
38 | while (encodeThread.processData() > 0);
39 | // Cancel any event left in the queue
40 | removeCallbacksAndMessages(null);
41 | encodeThread.flushAndRelease();
42 | getLooper().quit();
43 | }
44 | }
45 | }
46 |
47 | /**
48 | * Constructor
49 | * @param file file
50 | * @param bufferSize bufferSize
51 | * @throws FileNotFoundException file not found
52 | */
53 | public DataEncodeThread(File file, int bufferSize) throws FileNotFoundException {
54 | super("DataEncodeThread");
55 | this.mFileOutputStream = new FileOutputStream(file);
56 | mMp3Buffer = new byte[(int) (7200 + (bufferSize * 2 * 1.25))];
57 | }
58 |
59 | @Override
60 | public synchronized void start() {
61 | super.start();
62 | mHandler = new StopHandler(getLooper(), this);
63 | }
64 |
65 | private void check() {
66 | if (mHandler == null) {
67 | throw new IllegalStateException();
68 | }
69 | }
70 |
71 | public void sendStopMessage() {
72 | check();
73 | mHandler.sendEmptyMessage(PROCESS_STOP);
74 | }
75 | public Handler getHandler() {
76 | check();
77 | return mHandler;
78 | }
79 |
80 | @Override
81 | public void onMarkerReached(AudioRecord recorder) {
82 | // Do nothing
83 | }
84 |
85 | @Override
86 | public void onPeriodicNotification(AudioRecord recorder) {
87 | processData();
88 | }
89 | /**
90 | * 从缓冲区中读取并处理数据,使用lame编码MP3
91 | * @return 从缓冲区中读取的数据的长度
92 | * 缓冲区中没有数据时返回0
93 | */
94 | private int processData() {
95 | if (mTasks.size() > 0) {
96 | Task task = mTasks.remove(0);
97 | short[] buffer = task.getData();
98 | int readSize = task.getReadSize();
99 | int encodedSize = LameUtil.encode(buffer, buffer, readSize, mMp3Buffer);
100 | if (encodedSize > 0){
101 | try {
102 | mFileOutputStream.write(mMp3Buffer, 0, encodedSize);
103 | } catch (IOException e) {
104 | e.printStackTrace();
105 | }
106 | }
107 | return readSize;
108 | }
109 | return 0;
110 | }
111 |
112 | /**
113 | * Flush all data left in lame buffer to file
114 | */
115 | private void flushAndRelease() {
116 | //将MP3结尾信息写入buffer中
117 | final int flushResult = LameUtil.flush(mMp3Buffer);
118 | if (flushResult > 0) {
119 | try {
120 | mFileOutputStream.write(mMp3Buffer, 0, flushResult);
121 | } catch (IOException e) {
122 | e.printStackTrace();
123 | }finally{
124 | if (mFileOutputStream != null) {
125 | try {
126 | mFileOutputStream.close();
127 | } catch (IOException e) {
128 | e.printStackTrace();
129 | }
130 | }
131 | LameUtil.close();
132 | }
133 | }
134 | }
135 | private List mTasks = Collections.synchronizedList(new ArrayList());
136 | public void addTask(short[] rawData, int readSize){
137 | mTasks.add(new Task(rawData, readSize));
138 | }
139 | private class Task{
140 | private short[] rawData;
141 | private int readSize;
142 | public Task(short[] rawData, int readSize){
143 | this.rawData = rawData.clone();
144 | this.readSize = readSize;
145 | }
146 | public short[] getData(){
147 | return rawData;
148 | }
149 | public int getReadSize(){
150 | return readSize;
151 | }
152 | }
153 | }
154 |
--------------------------------------------------------------------------------
/library/src/main/java/com/czt/mp3recorder/MP3Recorder.java:
--------------------------------------------------------------------------------
1 | package com.czt.mp3recorder;
2 |
3 | import android.media.AudioFormat;
4 | import android.media.AudioRecord;
5 | import android.media.MediaRecorder;
6 | import android.os.Process;
7 |
8 | import com.czt.mp3recorder.util.LameUtil;
9 |
10 | import java.io.File;
11 | import java.io.IOException;
12 |
13 | public class MP3Recorder {
14 | //=======================AudioRecord Default Settings=======================
15 | private static final int DEFAULT_AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;
16 | /**
17 | * 以下三项为默认配置参数。Google Android文档明确表明只有以下3个参数是可以在所有设备上保证支持的。
18 | */
19 | private static final int DEFAULT_SAMPLING_RATE = 44100;//模拟器仅支持从麦克风输入8kHz采样率
20 | private static final int DEFAULT_CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
21 | /**
22 | * 下面是对此的封装
23 | * private static final int DEFAULT_AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
24 | */
25 | private static final PCMFormat DEFAULT_AUDIO_FORMAT = PCMFormat.PCM_16BIT;
26 |
27 | //======================Lame Default Settings=====================
28 | private static final int DEFAULT_LAME_MP3_QUALITY = 7;
29 | /**
30 | * 与DEFAULT_CHANNEL_CONFIG相关,因为是mono单声,所以是1
31 | */
32 | private static final int DEFAULT_LAME_IN_CHANNEL = 1;
33 | /**
34 | * default Encoded bit rate. MP3 file will be encoded with bit rate 128kbps
35 | */
36 | private static int DEFAULT_LAME_MP3_BIT_RATE = 128;
37 |
38 | //==================================================================
39 |
40 | /**
41 | * 自定义 每160帧作为一个周期,通知一下需要进行编码
42 | */
43 | private static final int FRAME_COUNT = 160;
44 | /**
45 | * 最大录音时间
46 | */
47 | private static long MAX_RECORD_TIME = -1;
48 | private long startRecordTime = 0;
49 | private AudioRecord mAudioRecord = null;
50 | private int mBufferSize;
51 | private short[] mPCMBuffer;
52 | private DataEncodeThread mEncodeThread;
53 | private boolean mIsRecording = false;
54 | private File mRecordFile;
55 | //分贝
56 | private int mVolumeDb;
57 | //音量
58 | private int mVolume;
59 | private RecordExceptionListener mRecordExceptionListener;
60 |
61 | /**
62 | * Default constructor. Setup recorder with default sampling rate 1 channel,
63 | * 16 bits pcm
64 | * @param recordFile target file
65 | */
66 | public MP3Recorder(File recordFile) {
67 | mRecordFile = recordFile;
68 | }
69 |
70 | /**
71 | * Start recording. Create an encoding thread. Start record from this
72 | * thread.
73 | *
74 | */
75 | public void start(){
76 | if (mIsRecording) {
77 | return;
78 | }
79 | mIsRecording = true; // 提早,防止init或startRecording被多次调用
80 | try {
81 | initAudioRecorder();
82 | } catch (Exception e) {
83 | if (mRecordExceptionListener != null) {
84 | mRecordExceptionListener.onError(e);
85 | }
86 | return;
87 | }
88 |
89 | Thread recordThread = new Thread() {
90 | @Override
91 | public void run() {
92 | startRecordTime = System.currentTimeMillis();
93 | //设置线程权限
94 | Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
95 | mAudioRecord.startRecording();
96 | while (mIsRecording) {
97 | if (mPCMBuffer != null) {
98 | int readSize = mAudioRecord.read(mPCMBuffer, 0, mBufferSize);
99 | if (readSize > 0) {
100 | mEncodeThread.addTask(mPCMBuffer, readSize);
101 | calculateRealVolume(mPCMBuffer, readSize);
102 | }
103 | }
104 | if (MAX_RECORD_TIME != -1){
105 | if (System.currentTimeMillis() - startRecordTime > MAX_RECORD_TIME){
106 | MP3Recorder.this.stop();
107 | }
108 | }
109 | }
110 | // release and finalize audioRecord
111 | mAudioRecord.stop();
112 | mAudioRecord.release();
113 | mAudioRecord = null;
114 | // stop the encoding thread and try to wait
115 | // until the thread finishes its job
116 | mEncodeThread.sendStopMessage();
117 | }
118 | /**
119 | * 此计算方法来自samsung开发范例
120 | *
121 | * @param buffer buffer
122 | * @param readSize readSize
123 | */
124 | private void calculateRealVolume(short[] buffer, int readSize) {
125 | double sum = 0;
126 | for (int i = 0; i < readSize; i++) {
127 | // 这里没有做运算的优化,为了更加清晰的展示代码
128 | sum += buffer[i] * buffer[i];
129 | }
130 | if (readSize > 0) {
131 | double amplitude = sum / readSize;
132 | mVolumeDb = (int) (10 * Math.log10(amplitude));
133 | mVolume = (int) Math.sqrt(amplitude);
134 | }
135 | }
136 | };
137 |
138 | recordThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
139 | @Override
140 | public void uncaughtException(Thread thread, final Throwable ex) {
141 | if (mRecordExceptionListener != null) {
142 | mRecordExceptionListener.onError(ex);
143 | }
144 | }
145 | });
146 | recordThread.start();
147 |
148 | }
149 |
150 | /**
151 | * 获取真实的音量。 [算法来自三星]
152 | * @return 真实音量
153 | */
154 | public int getRealVolume() {
155 | return mVolume;
156 | }
157 |
158 | /**
159 | * 获取当前分贝
160 | * @return 分贝
161 | */
162 | public int getVlumeDb(){
163 | return mVolumeDb;
164 | }
165 |
166 | /**
167 | * 获取相对音量。 超过最大值时取最大值。
168 | * @return 音量
169 | */
170 | public int getVolume(){
171 | if (mVolume >= MAX_VOLUME) {
172 | return MAX_VOLUME;
173 | }
174 | return mVolume;
175 | }
176 | private static final int MAX_VOLUME = 2000;
177 |
178 | /**
179 | * 根据资料假定的最大值。 实测时有时超过此值。
180 | * @return 最大音量值。
181 | */
182 | public int getMaxVolume(){
183 | return MAX_VOLUME;
184 | }
185 |
186 | /**
187 | * 停止录音
188 | */
189 | public void stop(){
190 | mIsRecording = false;
191 | }
192 |
193 | public boolean isRecording() {
194 | return mIsRecording;
195 | }
196 |
197 | /**
198 | * 设置输出码率
199 | * @param rate kbps
200 | */
201 | public void setDefaultLameMp3BitRate(int rate){
202 | DEFAULT_LAME_MP3_BIT_RATE = rate;
203 | }
204 |
205 | /**
206 | * 设置最大录音时长,默认不限制
207 | * @param milliSecond
208 | */
209 | public void setMaxRecordTime(long milliSecond){
210 | MAX_RECORD_TIME = milliSecond;
211 | }
212 |
213 | /**
214 | * 设置异常监听
215 | * @param listener
216 | */
217 | public void setRecordExceptionListener(RecordExceptionListener listener){
218 | mRecordExceptionListener = listener;
219 | }
220 |
221 | /**
222 | * Initialize audio recorder
223 | */
224 | private void initAudioRecorder() throws IOException, IllegalArgumentException {
225 | mBufferSize = AudioRecord.getMinBufferSize(DEFAULT_SAMPLING_RATE,
226 | DEFAULT_CHANNEL_CONFIG, DEFAULT_AUDIO_FORMAT.getAudioFormat());
227 |
228 | int bytesPerFrame = DEFAULT_AUDIO_FORMAT.getBytesPerFrame();
229 | /* Get number of samples. Calculate the buffer size
230 | * (round up to the factor of given frame size)
231 | * 使能被整除,方便下面的周期性通知
232 | * */
233 | int frameSize = mBufferSize / bytesPerFrame;
234 | if (frameSize % FRAME_COUNT != 0) {
235 | frameSize += (FRAME_COUNT - frameSize % FRAME_COUNT);
236 | mBufferSize = frameSize * bytesPerFrame;
237 | }
238 |
239 | /* Setup audio recorder */
240 | mAudioRecord = new AudioRecord(DEFAULT_AUDIO_SOURCE,
241 | DEFAULT_SAMPLING_RATE, DEFAULT_CHANNEL_CONFIG, DEFAULT_AUDIO_FORMAT.getAudioFormat(),
242 | mBufferSize);
243 |
244 | mPCMBuffer = new short[mBufferSize];
245 | /*
246 | * Initialize lame buffer
247 | * mp3 sampling rate is the same as the recorded pcm sampling rate
248 | * The bit rate is 32kbps
249 | *
250 | */
251 | LameUtil.init(DEFAULT_SAMPLING_RATE, DEFAULT_LAME_IN_CHANNEL, DEFAULT_SAMPLING_RATE, DEFAULT_LAME_MP3_BIT_RATE, DEFAULT_LAME_MP3_QUALITY);
252 | // Create and run thread used to encode data
253 | // The thread will
254 | mEncodeThread = new DataEncodeThread(mRecordFile, mBufferSize);
255 | mEncodeThread.start();
256 | mAudioRecord.setRecordPositionUpdateListener(mEncodeThread, mEncodeThread.getHandler());
257 | mAudioRecord.setPositionNotificationPeriod(FRAME_COUNT);
258 | }
259 |
260 | }
--------------------------------------------------------------------------------
/library/src/main/java/com/czt/mp3recorder/PCMFormat.java:
--------------------------------------------------------------------------------
1 | package com.czt.mp3recorder;
2 |
3 | import android.media.AudioFormat;
4 |
5 | public enum PCMFormat {
6 | PCM_8BIT (1, AudioFormat.ENCODING_PCM_8BIT),
7 | PCM_16BIT (2, AudioFormat.ENCODING_PCM_16BIT);
8 |
9 | private int bytesPerFrame;
10 | private int audioFormat;
11 |
12 | PCMFormat(int bytesPerFrame, int audioFormat) {
13 | this.bytesPerFrame = bytesPerFrame;
14 | this.audioFormat = audioFormat;
15 | }
16 | public int getBytesPerFrame() {
17 | return bytesPerFrame;
18 | }
19 | public int getAudioFormat() {
20 | return audioFormat;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/library/src/main/java/com/czt/mp3recorder/RecordExceptionListener.java:
--------------------------------------------------------------------------------
1 | package com.czt.mp3recorder;
2 |
3 |
4 |
5 | /**
6 | * ================================================
7 | * 作 者:JayGoo
8 | * 版 本:
9 | * 创建日期:2017/7/18
10 | * 描 述:ExceptionListener
11 | * Attention: This interface may be not run on UI Thread !
12 | * ================================================
13 | */
14 | public interface RecordExceptionListener {
15 | void onError(Throwable e);
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/library/src/main/java/com/czt/mp3recorder/util/LameUtil.java:
--------------------------------------------------------------------------------
1 | package com.czt.mp3recorder.util;
2 |
3 | public class LameUtil {
4 | static{
5 | System.loadLibrary("mp3lame");
6 | }
7 |
8 | /**
9 | * Initialize LAME.
10 | *
11 | * @param inSamplerate
12 | * input sample rate in Hz.
13 | * @param inChannel
14 | * number of channels in input stream.
15 | * @param outSamplerate
16 | * output sample rate in Hz.
17 | * @param outBitrate
18 | * brate compression ratio in KHz.
19 | * @param quality
20 | *
quality=0..9. 0=best (very slow). 9=worst.
21 | *
recommended:
22 | *
2 near-best quality, not too slow
23 | *
5 good quality, fast
24 | * 7 ok quality, really fast
25 | */
26 | public native static void init(int inSamplerate, int inChannel,
27 | int outSamplerate, int outBitrate, int quality);
28 |
29 | /**
30 | * Encode buffer to mp3.
31 | *
32 | * @param bufferLeft
33 | * PCM data for left channel.
34 | * @param bufferRight
35 | * PCM data for right channel.
36 | * @param samples
37 | * number of samples per channel.
38 | * @param mp3buf
39 | * result encoded MP3 stream. You must specified
40 | * "7200 + (1.25 * buffer_l.length)" length array.
41 | * @return
number of bytes output in mp3buf. Can be 0.
42 | *
-1: mp3buf was too small
43 | *
-2: malloc() problem
44 | *
-3: lame_init_params() not called
45 | * -4: psycho acoustic problems
46 | */
47 | public native static int encode(short[] bufferLeft, short[] bufferRight,
48 | int samples, byte[] mp3buf);
49 |
50 | /**
51 | * Flush LAME buffer.
52 | *
53 | * REQUIRED:
54 | * lame_encode_flush will flush the intenal PCM buffers, padding with
55 | * 0's to make sure the final frame is complete, and then flush
56 | * the internal MP3 buffers, and thus may return a
57 | * final few mp3 frames. 'mp3buf' should be at least 7200 bytes long
58 | * to hold all possible emitted data.
59 | *
60 | * will also write id3v1 tags (if any) into the bitstream
61 | *
62 | * return code = number of bytes output to mp3buf. Can be 0
63 | * @param mp3buf
64 | * result encoded MP3 stream. You must specified at least 7200
65 | * bytes.
66 | * @return number of bytes output to mp3buf. Can be 0.
67 | */
68 | public native static int flush(byte[] mp3buf);
69 |
70 | /**
71 | * Close LAME.
72 | */
73 | public native static void close();
74 | }
75 |
--------------------------------------------------------------------------------
/library/src/main/jni/Android.mk:
--------------------------------------------------------------------------------
1 | LOCAL_PATH := $(call my-dir)
2 |
3 | include $(CLEAR_VARS)
4 |
5 | LAME_LIBMP3_DIR := lame_3.99.5_libmp3lame
6 |
7 | LOCAL_MODULE := mp3lame
8 | LOCAL_SRC_FILES := $(LAME_LIBMP3_DIR)/bitstream.c $(LAME_LIBMP3_DIR)/fft.c $(LAME_LIBMP3_DIR)/id3tag.c $(LAME_LIBMP3_DIR)/mpglib_interface.c $(LAME_LIBMP3_DIR)/presets.c $(LAME_LIBMP3_DIR)/quantize.c $(LAME_LIBMP3_DIR)/reservoir.c $(LAME_LIBMP3_DIR)/tables.c $(LAME_LIBMP3_DIR)/util.c $(LAME_LIBMP3_DIR)/VbrTag.c $(LAME_LIBMP3_DIR)/encoder.c $(LAME_LIBMP3_DIR)/gain_analysis.c $(LAME_LIBMP3_DIR)/lame.c $(LAME_LIBMP3_DIR)/newmdct.c $(LAME_LIBMP3_DIR)/psymodel.c $(LAME_LIBMP3_DIR)/quantize_pvt.c $(LAME_LIBMP3_DIR)/set_get.c $(LAME_LIBMP3_DIR)/takehiro.c $(LAME_LIBMP3_DIR)/vbrquantize.c $(LAME_LIBMP3_DIR)/version.c lame_util.c
9 |
10 | include $(BUILD_SHARED_LIBRARY)
11 |
--------------------------------------------------------------------------------
/library/src/main/jni/Application.mk:
--------------------------------------------------------------------------------
1 | APP_PLATFORM := android-9
2 | APP_ABI := all
3 | APP_CFLAGS += -DSTDC_HEADERS
--------------------------------------------------------------------------------
/library/src/main/jni/com_czt_mp3recorder_util_LameUtil.h:
--------------------------------------------------------------------------------
1 | /* DO NOT EDIT THIS FILE - it is machine generated */
2 | #include
3 | /* Header for class com_czt_mp3recorder_util_LameUtil */
4 |
5 | #ifndef _Included_com_czt_mp3recorder_util_LameUtil
6 | #define _Included_com_czt_mp3recorder_util_LameUtil
7 | #ifdef __cplusplus
8 | extern "C" {
9 | #endif
10 | /*
11 | * Class: com_czt_mp3recorder_util_LameUtil
12 | * Method: init
13 | * Signature: (IIIII)V
14 | */
15 | JNIEXPORT void JNICALL Java_com_czt_mp3recorder_util_LameUtil_init
16 | (JNIEnv *, jclass, jint, jint, jint, jint, jint);
17 |
18 | /*
19 | * Class: com_czt_mp3recorder_util_LameUtil
20 | * Method: encode
21 | * Signature: ([S[SI[B)I
22 | */
23 | JNIEXPORT jint JNICALL Java_com_czt_mp3recorder_util_LameUtil_encode
24 | (JNIEnv *, jclass, jshortArray, jshortArray, jint, jbyteArray);
25 |
26 | /*
27 | * Class: com_czt_mp3recorder_util_LameUtil
28 | * Method: flush
29 | * Signature: ([B)I
30 | */
31 | JNIEXPORT jint JNICALL Java_com_czt_mp3recorder_util_LameUtil_flush
32 | (JNIEnv *, jclass, jbyteArray);
33 |
34 | /*
35 | * Class: com_czt_mp3recorder_util_LameUtil
36 | * Method: close
37 | * Signature: ()V
38 | */
39 | JNIEXPORT void JNICALL Java_com_czt_mp3recorder_util_LameUtil_close
40 | (JNIEnv *, jclass);
41 |
42 | #ifdef __cplusplus
43 | }
44 | #endif
45 | #endif
46 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/VbrTag.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Xing VBR tagging for LAME.
3 | *
4 | * Copyright (c) 1999 A.L. Faber
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_VRBTAG_H
23 | #define LAME_VRBTAG_H
24 |
25 |
26 | /* -----------------------------------------------------------
27 | * A Vbr header may be present in the ancillary
28 | * data field of the first frame of an mp3 bitstream
29 | * The Vbr header (optionally) contains
30 | * frames total number of audio frames in the bitstream
31 | * bytes total number of bytes in the bitstream
32 | * toc table of contents
33 |
34 | * toc (table of contents) gives seek points
35 | * for random access
36 | * the ith entry determines the seek point for
37 | * i-percent duration
38 | * seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes
39 | * e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes
40 | */
41 |
42 |
43 | #define FRAMES_FLAG 0x0001
44 | #define BYTES_FLAG 0x0002
45 | #define TOC_FLAG 0x0004
46 | #define VBR_SCALE_FLAG 0x0008
47 |
48 | #define NUMTOCENTRIES 100
49 |
50 | #ifndef lame_internal_flags_defined
51 | #define lame_internal_flags_defined
52 | struct lame_internal_flags;
53 | typedef struct lame_internal_flags lame_internal_flags;
54 | #endif
55 |
56 |
57 | /*structure to receive extracted header */
58 | /* toc may be NULL*/
59 | typedef struct {
60 | int h_id; /* from MPEG header, 0=MPEG2, 1=MPEG1 */
61 | int samprate; /* determined from MPEG header */
62 | int flags; /* from Vbr header data */
63 | int frames; /* total bit stream frames from Vbr header data */
64 | int bytes; /* total bit stream bytes from Vbr header data */
65 | int vbr_scale; /* encoded vbr scale from Vbr header data */
66 | unsigned char toc[NUMTOCENTRIES]; /* may be NULL if toc not desired */
67 | int headersize; /* size of VBR header, in bytes */
68 | int enc_delay; /* encoder delay */
69 | int enc_padding; /* encoder paddign added at end of stream */
70 | } VBRTAGDATA;
71 |
72 | int GetVbrTag(VBRTAGDATA * pTagData, const unsigned char *buf);
73 |
74 | int InitVbrTag(lame_global_flags * gfp);
75 | int PutVbrTag(lame_global_flags const *gfp, FILE * fid);
76 | void AddVbrFrame(lame_internal_flags * gfc);
77 | void UpdateMusicCRC(uint16_t * crc, const unsigned char *buffer, int size);
78 |
79 | #endif
80 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/bitstream.h:
--------------------------------------------------------------------------------
1 | /*
2 | * MP3 bitstream Output interface for LAME
3 | *
4 | * Copyright (c) 1999 Takehiro TOMINAGA
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_BITSTREAM_H
23 | #define LAME_BITSTREAM_H
24 |
25 | int getframebits(const lame_internal_flags * gfc);
26 |
27 | int format_bitstream(lame_internal_flags * gfc);
28 |
29 | void flush_bitstream(lame_internal_flags * gfc);
30 | void add_dummy_byte(lame_internal_flags * gfc, unsigned char val, unsigned int n);
31 |
32 | int copy_buffer(lame_internal_flags * gfc, unsigned char *buffer, int buffer_size,
33 | int update_crc);
34 | void init_bit_stream_w(lame_internal_flags * gfc);
35 | void CRC_writeheader(lame_internal_flags const *gfc, char *buffer);
36 | int compute_flushbits(const lame_internal_flags * gfp, int *nbytes);
37 |
38 | int get_max_frame_buffer_size_by_constraint(SessionConfig_t const * cfg, int constraint);
39 |
40 | #endif
41 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/encoder.c:
--------------------------------------------------------------------------------
1 | /*
2 | * LAME MP3 encoding engine
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | * Copyright (c) 2000-2002 Takehiro Tominaga
6 | * Copyright (c) 2000-2011 Robert Hegemann
7 | * Copyright (c) 2001 Gabriel Bouvigne
8 | * Copyright (c) 2001 John Dahlstrom
9 | *
10 | * This library is free software; you can redistribute it and/or
11 | * modify it under the terms of the GNU Library General Public
12 | * License as published by the Free Software Foundation; either
13 | * version 2 of the License, or (at your option) any later version.
14 | *
15 | * This library is distributed in the hope that it will be useful,
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 | * Library General Public License for more details.
19 | *
20 | * You should have received a copy of the GNU Library General Public
21 | * License along with this library; if not, write to the
22 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 | * Boston, MA 02111-1307, USA.
24 | */
25 |
26 | /* $Id: encoder.c,v 1.111 2011/05/07 16:05:17 rbrito Exp $ */
27 |
28 | #ifdef HAVE_CONFIG_H
29 | #include
30 | #endif
31 |
32 |
33 | #include "lame.h"
34 | #include "machine.h"
35 | #include "encoder.h"
36 | #include "util.h"
37 | #include "lame_global_flags.h"
38 | #include "newmdct.h"
39 | #include "psymodel.h"
40 | #include "lame-analysis.h"
41 | #include "bitstream.h"
42 | #include "VbrTag.h"
43 | #include "quantize_pvt.h"
44 |
45 |
46 |
47 | /*
48 | * auto-adjust of ATH, useful for low volume
49 | * Gabriel Bouvigne 3 feb 2001
50 | *
51 | * modifies some values in
52 | * gfp->internal_flags->ATH
53 | * (gfc->ATH)
54 | */
55 | static void
56 | adjust_ATH(lame_internal_flags const *const gfc)
57 | {
58 | SessionConfig_t const *const cfg = &gfc->cfg;
59 | FLOAT gr2_max, max_pow;
60 |
61 | if (gfc->ATH->use_adjust == 0) {
62 | gfc->ATH->adjust_factor = 1.0; /* no adjustment */
63 | return;
64 | }
65 |
66 | /* jd - 2001 mar 12, 27, jun 30 */
67 | /* loudness based on equal loudness curve; */
68 | /* use granule with maximum combined loudness */
69 | max_pow = gfc->ov_psy.loudness_sq[0][0];
70 | gr2_max = gfc->ov_psy.loudness_sq[1][0];
71 | if (cfg->channels_out == 2) {
72 | max_pow += gfc->ov_psy.loudness_sq[0][1];
73 | gr2_max += gfc->ov_psy.loudness_sq[1][1];
74 | }
75 | else {
76 | max_pow += max_pow;
77 | gr2_max += gr2_max;
78 | }
79 | if (cfg->mode_gr == 2) {
80 | max_pow = Max(max_pow, gr2_max);
81 | }
82 | max_pow *= 0.5; /* max_pow approaches 1.0 for full band noise */
83 |
84 | /* jd - 2001 mar 31, jun 30 */
85 | /* user tuning of ATH adjustment region */
86 | max_pow *= gfc->ATH->aa_sensitivity_p;
87 |
88 | /* adjust ATH depending on range of maximum value
89 | */
90 |
91 | /* jd - 2001 feb27, mar12,20, jun30, jul22 */
92 | /* continuous curves based on approximation */
93 | /* to GB's original values. */
94 | /* For an increase in approximate loudness, */
95 | /* set ATH adjust to adjust_limit immediately */
96 | /* after a delay of one frame. */
97 | /* For a loudness decrease, reduce ATH adjust */
98 | /* towards adjust_limit gradually. */
99 | /* max_pow is a loudness squared or a power. */
100 | if (max_pow > 0.03125) { /* ((1 - 0.000625)/ 31.98) from curve below */
101 | if (gfc->ATH->adjust_factor >= 1.0) {
102 | gfc->ATH->adjust_factor = 1.0;
103 | }
104 | else {
105 | /* preceding frame has lower ATH adjust; */
106 | /* ascend only to the preceding adjust_limit */
107 | /* in case there is leading low volume */
108 | if (gfc->ATH->adjust_factor < gfc->ATH->adjust_limit) {
109 | gfc->ATH->adjust_factor = gfc->ATH->adjust_limit;
110 | }
111 | }
112 | gfc->ATH->adjust_limit = 1.0;
113 | }
114 | else { /* adjustment curve */
115 | /* about 32 dB maximum adjust (0.000625) */
116 | FLOAT const adj_lim_new = 31.98 * max_pow + 0.000625;
117 | if (gfc->ATH->adjust_factor >= adj_lim_new) { /* descend gradually */
118 | gfc->ATH->adjust_factor *= adj_lim_new * 0.075 + 0.925;
119 | if (gfc->ATH->adjust_factor < adj_lim_new) { /* stop descent */
120 | gfc->ATH->adjust_factor = adj_lim_new;
121 | }
122 | }
123 | else { /* ascend */
124 | if (gfc->ATH->adjust_limit >= adj_lim_new) {
125 | gfc->ATH->adjust_factor = adj_lim_new;
126 | }
127 | else { /* preceding frame has lower ATH adjust; */
128 | /* ascend only to the preceding adjust_limit */
129 | if (gfc->ATH->adjust_factor < gfc->ATH->adjust_limit) {
130 | gfc->ATH->adjust_factor = gfc->ATH->adjust_limit;
131 | }
132 | }
133 | }
134 | gfc->ATH->adjust_limit = adj_lim_new;
135 | }
136 | }
137 |
138 | /***********************************************************************
139 | *
140 | * some simple statistics
141 | *
142 | * bitrate index 0: free bitrate -> not allowed in VBR mode
143 | * : bitrates, kbps depending on MPEG version
144 | * bitrate index 15: forbidden
145 | *
146 | * mode_ext:
147 | * 0: LR
148 | * 1: LR-i
149 | * 2: MS
150 | * 3: MS-i
151 | *
152 | ***********************************************************************/
153 |
154 | static void
155 | updateStats(lame_internal_flags * const gfc)
156 | {
157 | SessionConfig_t const *const cfg = &gfc->cfg;
158 | EncResult_t *eov = &gfc->ov_enc;
159 | int gr, ch;
160 | assert(0 <= eov->bitrate_index && eov->bitrate_index < 16);
161 | assert(0 <= eov->mode_ext && eov->mode_ext < 4);
162 |
163 | /* count bitrate indices */
164 | eov->bitrate_channelmode_hist[eov->bitrate_index][4]++;
165 | eov->bitrate_channelmode_hist[15][4]++;
166 |
167 | /* count 'em for every mode extension in case of 2 channel encoding */
168 | if (cfg->channels_out == 2) {
169 | eov->bitrate_channelmode_hist[eov->bitrate_index][eov->mode_ext]++;
170 | eov->bitrate_channelmode_hist[15][eov->mode_ext]++;
171 | }
172 | for (gr = 0; gr < cfg->mode_gr; ++gr) {
173 | for (ch = 0; ch < cfg->channels_out; ++ch) {
174 | int bt = gfc->l3_side.tt[gr][ch].block_type;
175 | if (gfc->l3_side.tt[gr][ch].mixed_block_flag)
176 | bt = 4;
177 | eov->bitrate_blocktype_hist[eov->bitrate_index][bt]++;
178 | eov->bitrate_blocktype_hist[eov->bitrate_index][5]++;
179 | eov->bitrate_blocktype_hist[15][bt]++;
180 | eov->bitrate_blocktype_hist[15][5]++;
181 | }
182 | }
183 | }
184 |
185 |
186 |
187 |
188 | static void
189 | lame_encode_frame_init(lame_internal_flags * gfc, const sample_t *const inbuf[2])
190 | {
191 | SessionConfig_t const *const cfg = &gfc->cfg;
192 |
193 | int ch, gr;
194 |
195 | if (gfc->lame_encode_frame_init == 0) {
196 | sample_t primebuff0[286 + 1152 + 576];
197 | sample_t primebuff1[286 + 1152 + 576];
198 | int const framesize = 576 * cfg->mode_gr;
199 | /* prime the MDCT/polyphase filterbank with a short block */
200 | int i, j;
201 | gfc->lame_encode_frame_init = 1;
202 | memset(primebuff0, 0, sizeof(primebuff0));
203 | memset(primebuff1, 0, sizeof(primebuff1));
204 | for (i = 0, j = 0; i < 286 + 576 * (1 + cfg->mode_gr); ++i) {
205 | if (i < framesize) {
206 | primebuff0[i] = 0;
207 | if (cfg->channels_out == 2)
208 | primebuff1[i] = 0;
209 | }
210 | else {
211 | primebuff0[i] = inbuf[0][j];
212 | if (cfg->channels_out == 2)
213 | primebuff1[i] = inbuf[1][j];
214 | ++j;
215 | }
216 | }
217 | /* polyphase filtering / mdct */
218 | for (gr = 0; gr < cfg->mode_gr; gr++) {
219 | for (ch = 0; ch < cfg->channels_out; ch++) {
220 | gfc->l3_side.tt[gr][ch].block_type = SHORT_TYPE;
221 | }
222 | }
223 | mdct_sub48(gfc, primebuff0, primebuff1);
224 |
225 | /* check FFT will not use a negative starting offset */
226 | #if 576 < FFTOFFSET
227 | # error FFTOFFSET greater than 576: FFT uses a negative offset
228 | #endif
229 | /* check if we have enough data for FFT */
230 | assert(gfc->sv_enc.mf_size >= (BLKSIZE + framesize - FFTOFFSET));
231 | /* check if we have enough data for polyphase filterbank */
232 | assert(gfc->sv_enc.mf_size >= (512 + framesize - 32));
233 | }
234 |
235 | }
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 | /************************************************************************
244 | *
245 | * encodeframe() Layer 3
246 | *
247 | * encode a single frame
248 | *
249 | ************************************************************************
250 | lame_encode_frame()
251 |
252 |
253 | gr 0 gr 1
254 | inbuf: |--------------|--------------|--------------|
255 |
256 |
257 | Polyphase (18 windows, each shifted 32)
258 | gr 0:
259 | window1 <----512---->
260 | window18 <----512---->
261 |
262 | gr 1:
263 | window1 <----512---->
264 | window18 <----512---->
265 |
266 |
267 |
268 | MDCT output: |--------------|--------------|--------------|
269 |
270 | FFT's <---------1024---------->
271 | <---------1024-------->
272 |
273 |
274 |
275 | inbuf = buffer of PCM data size=MP3 framesize
276 | encoder acts on inbuf[ch][0], but output is delayed by MDCTDELAY
277 | so the MDCT coefficints are from inbuf[ch][-MDCTDELAY]
278 |
279 | psy-model FFT has a 1 granule delay, so we feed it data for the
280 | next granule.
281 | FFT is centered over granule: 224+576+224
282 | So FFT starts at: 576-224-MDCTDELAY
283 |
284 | MPEG2: FFT ends at: BLKSIZE+576-224-MDCTDELAY (1328)
285 | MPEG1: FFT ends at: BLKSIZE+2*576-224-MDCTDELAY (1904)
286 |
287 | MPEG2: polyphase first window: [0..511]
288 | 18th window: [544..1055] (1056)
289 | MPEG1: 36th window: [1120..1631] (1632)
290 | data needed: 512+framesize-32
291 |
292 | A close look newmdct.c shows that the polyphase filterbank
293 | only uses data from [0..510] for each window. Perhaps because the window
294 | used by the filterbank is zero for the last point, so Takehiro's
295 | code doesn't bother to compute with it.
296 |
297 | FFT starts at 576-224-MDCTDELAY (304) = 576-FFTOFFSET
298 |
299 | */
300 |
301 | typedef FLOAT chgrdata[2][2];
302 |
303 |
304 | int
305 | lame_encode_mp3_frame( /* Output */
306 | lame_internal_flags * gfc, /* Context */
307 | sample_t const *inbuf_l, /* Input */
308 | sample_t const *inbuf_r, /* Input */
309 | unsigned char *mp3buf, /* Output */
310 | int mp3buf_size)
311 | { /* Output */
312 | SessionConfig_t const *const cfg = &gfc->cfg;
313 | int mp3count;
314 | III_psy_ratio masking_LR[2][2]; /*LR masking & energy */
315 | III_psy_ratio masking_MS[2][2]; /*MS masking & energy */
316 | const III_psy_ratio (*masking)[2]; /*pointer to selected maskings */
317 | const sample_t *inbuf[2];
318 |
319 | FLOAT tot_ener[2][4];
320 | FLOAT ms_ener_ratio[2] = { .5, .5 };
321 | FLOAT pe[2][2] = { {0., 0.}, {0., 0.} }, pe_MS[2][2] = { {
322 | 0., 0.}, {
323 | 0., 0.}};
324 | FLOAT (*pe_use)[2];
325 |
326 | int ch, gr;
327 |
328 | inbuf[0] = inbuf_l;
329 | inbuf[1] = inbuf_r;
330 |
331 | if (gfc->lame_encode_frame_init == 0) {
332 | /*first run? */
333 | lame_encode_frame_init(gfc, inbuf);
334 |
335 | }
336 |
337 |
338 | /********************** padding *****************************/
339 | /* padding method as described in
340 | * "MPEG-Layer3 / Bitstream Syntax and Decoding"
341 | * by Martin Sieler, Ralph Sperschneider
342 | *
343 | * note: there is no padding for the very first frame
344 | *
345 | * Robert Hegemann 2000-06-22
346 | */
347 | gfc->ov_enc.padding = FALSE;
348 | if ((gfc->sv_enc.slot_lag -= gfc->sv_enc.frac_SpF) < 0) {
349 | gfc->sv_enc.slot_lag += cfg->samplerate_out;
350 | gfc->ov_enc.padding = TRUE;
351 | }
352 |
353 |
354 |
355 | /****************************************
356 | * Stage 1: psychoacoustic model *
357 | ****************************************/
358 |
359 | {
360 | /* psychoacoustic model
361 | * psy model has a 1 granule (576) delay that we must compensate for
362 | * (mt 6/99).
363 | */
364 | int ret;
365 | const sample_t *bufp[2] = {0, 0}; /* address of beginning of left & right granule */
366 | int blocktype[2];
367 |
368 | for (gr = 0; gr < cfg->mode_gr; gr++) {
369 |
370 | for (ch = 0; ch < cfg->channels_out; ch++) {
371 | bufp[ch] = &inbuf[ch][576 + gr * 576 - FFTOFFSET];
372 | }
373 | ret = L3psycho_anal_vbr(gfc, bufp, gr,
374 | masking_LR, masking_MS,
375 | pe[gr], pe_MS[gr], tot_ener[gr], blocktype);
376 | if (ret != 0)
377 | return -4;
378 |
379 | if (cfg->mode == JOINT_STEREO) {
380 | ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3];
381 | if (ms_ener_ratio[gr] > 0)
382 | ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr];
383 | }
384 |
385 | /* block type flags */
386 | for (ch = 0; ch < cfg->channels_out; ch++) {
387 | gr_info *const cod_info = &gfc->l3_side.tt[gr][ch];
388 | cod_info->block_type = blocktype[ch];
389 | cod_info->mixed_block_flag = 0;
390 | }
391 | }
392 | }
393 |
394 |
395 | /* auto-adjust of ATH, useful for low volume */
396 | adjust_ATH(gfc);
397 |
398 |
399 | /****************************************
400 | * Stage 2: MDCT *
401 | ****************************************/
402 |
403 | /* polyphase filtering / mdct */
404 | mdct_sub48(gfc, inbuf[0], inbuf[1]);
405 |
406 |
407 | /****************************************
408 | * Stage 3: MS/LR decision *
409 | ****************************************/
410 |
411 | /* Here will be selected MS or LR coding of the 2 stereo channels */
412 | gfc->ov_enc.mode_ext = MPG_MD_LR_LR;
413 |
414 | if (cfg->force_ms) {
415 | gfc->ov_enc.mode_ext = MPG_MD_MS_LR;
416 | }
417 | else if (cfg->mode == JOINT_STEREO) {
418 | /* ms_ratio = is scaled, for historical reasons, to look like
419 | a ratio of side_channel / total.
420 | 0 = signal is 100% mono
421 | .5 = L & R uncorrelated
422 | */
423 |
424 | /* [0] and [1] are the results for the two granules in MPEG-1,
425 | * in MPEG-2 it's only a faked averaging of the same value
426 | * _prev is the value of the last granule of the previous frame
427 | * _next is the value of the first granule of the next frame
428 | */
429 |
430 | FLOAT sum_pe_MS = 0;
431 | FLOAT sum_pe_LR = 0;
432 | for (gr = 0; gr < cfg->mode_gr; gr++) {
433 | for (ch = 0; ch < cfg->channels_out; ch++) {
434 | sum_pe_MS += pe_MS[gr][ch];
435 | sum_pe_LR += pe[gr][ch];
436 | }
437 | }
438 |
439 | /* based on PE: M/S coding would not use much more bits than L/R */
440 | if (sum_pe_MS <= 1.00 * sum_pe_LR) {
441 |
442 | gr_info const *const gi0 = &gfc->l3_side.tt[0][0];
443 | gr_info const *const gi1 = &gfc->l3_side.tt[cfg->mode_gr - 1][0];
444 |
445 | if (gi0[0].block_type == gi0[1].block_type && gi1[0].block_type == gi1[1].block_type) {
446 |
447 | gfc->ov_enc.mode_ext = MPG_MD_MS_LR;
448 | }
449 | }
450 | }
451 |
452 | /* bit and noise allocation */
453 | if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) {
454 | masking = (const III_psy_ratio (*)[2])masking_MS; /* use MS masking */
455 | pe_use = pe_MS;
456 | }
457 | else {
458 | masking = (const III_psy_ratio (*)[2])masking_LR; /* use LR masking */
459 | pe_use = pe;
460 | }
461 |
462 |
463 | /* copy data for MP3 frame analyzer */
464 | if (cfg->analysis && gfc->pinfo != NULL) {
465 | for (gr = 0; gr < cfg->mode_gr; gr++) {
466 | for (ch = 0; ch < cfg->channels_out; ch++) {
467 | gfc->pinfo->ms_ratio[gr] = 0;
468 | gfc->pinfo->ms_ener_ratio[gr] = ms_ener_ratio[gr];
469 | gfc->pinfo->blocktype[gr][ch] = gfc->l3_side.tt[gr][ch].block_type;
470 | gfc->pinfo->pe[gr][ch] = pe_use[gr][ch];
471 | memcpy(gfc->pinfo->xr[gr][ch], &gfc->l3_side.tt[gr][ch].xr[0], sizeof(FLOAT) * 576);
472 | /* in psymodel, LR and MS data was stored in pinfo.
473 | switch to MS data: */
474 | if (gfc->ov_enc.mode_ext == MPG_MD_MS_LR) {
475 | gfc->pinfo->ers[gr][ch] = gfc->pinfo->ers[gr][ch + 2];
476 | memcpy(gfc->pinfo->energy[gr][ch], gfc->pinfo->energy[gr][ch + 2],
477 | sizeof(gfc->pinfo->energy[gr][ch]));
478 | }
479 | }
480 | }
481 | }
482 |
483 |
484 | /****************************************
485 | * Stage 4: quantization loop *
486 | ****************************************/
487 |
488 | if (cfg->vbr == vbr_off || cfg->vbr == vbr_abr) {
489 | static FLOAT const fircoef[9] = {
490 | -0.0207887 * 5, -0.0378413 * 5, -0.0432472 * 5, -0.031183 * 5,
491 | 7.79609e-18 * 5, 0.0467745 * 5, 0.10091 * 5, 0.151365 * 5,
492 | 0.187098 * 5
493 | };
494 |
495 | int i;
496 | FLOAT f;
497 |
498 | for (i = 0; i < 18; i++)
499 | gfc->sv_enc.pefirbuf[i] = gfc->sv_enc.pefirbuf[i + 1];
500 |
501 | f = 0.0;
502 | for (gr = 0; gr < cfg->mode_gr; gr++)
503 | for (ch = 0; ch < cfg->channels_out; ch++)
504 | f += pe_use[gr][ch];
505 | gfc->sv_enc.pefirbuf[18] = f;
506 |
507 | f = gfc->sv_enc.pefirbuf[9];
508 | for (i = 0; i < 9; i++)
509 | f += (gfc->sv_enc.pefirbuf[i] + gfc->sv_enc.pefirbuf[18 - i]) * fircoef[i];
510 |
511 | f = (670 * 5 * cfg->mode_gr * cfg->channels_out) / f;
512 | for (gr = 0; gr < cfg->mode_gr; gr++) {
513 | for (ch = 0; ch < cfg->channels_out; ch++) {
514 | pe_use[gr][ch] *= f;
515 | }
516 | }
517 | }
518 | gfc->iteration_loop(gfc, (const FLOAT (*)[2])pe_use, ms_ener_ratio, masking);
519 |
520 |
521 | /****************************************
522 | * Stage 5: bitstream formatting *
523 | ****************************************/
524 |
525 |
526 | /* write the frame to the bitstream */
527 | (void) format_bitstream(gfc);
528 |
529 | /* copy mp3 bit buffer into array */
530 | mp3count = copy_buffer(gfc, mp3buf, mp3buf_size, 1);
531 |
532 |
533 | if (cfg->write_lame_tag) {
534 | AddVbrFrame(gfc);
535 | }
536 |
537 | if (cfg->analysis && gfc->pinfo != NULL) {
538 | int framesize = 576 * cfg->mode_gr;
539 | for (ch = 0; ch < cfg->channels_out; ch++) {
540 | int j;
541 | for (j = 0; j < FFTOFFSET; j++)
542 | gfc->pinfo->pcmdata[ch][j] = gfc->pinfo->pcmdata[ch][j + framesize];
543 | for (j = FFTOFFSET; j < 1600; j++) {
544 | gfc->pinfo->pcmdata[ch][j] = inbuf[ch][j - FFTOFFSET];
545 | }
546 | }
547 | gfc->sv_qnt.masking_lower = 1.0;
548 |
549 | set_frame_pinfo(gfc, masking);
550 | }
551 |
552 | ++gfc->ov_enc.frame_number;
553 |
554 | updateStats(gfc);
555 |
556 | return mp3count;
557 | }
558 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/encoder.h:
--------------------------------------------------------------------------------
1 | /*
2 | * encoder.h include file
3 | *
4 | * Copyright (c) 2000 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 |
23 | #ifndef LAME_ENCODER_H
24 | #define LAME_ENCODER_H
25 |
26 | /***********************************************************************
27 | *
28 | * encoder and decoder delays
29 | *
30 | ***********************************************************************/
31 |
32 | /*
33 | * layer III enc->dec delay: 1056 (1057?) (observed)
34 | * layer II enc->dec delay: 480 (481?) (observed)
35 | *
36 | * polyphase 256-16 (dec or enc) = 240
37 | * mdct 256+32 (9*32) (dec or enc) = 288
38 | * total: 512+16
39 | *
40 | * My guess is that delay of polyphase filterbank is actualy 240.5
41 | * (there are technical reasons for this, see postings in mp3encoder).
42 | * So total Encode+Decode delay = ENCDELAY + 528 + 1
43 | */
44 |
45 | /*
46 | * ENCDELAY The encoder delay.
47 | *
48 | * Minimum allowed is MDCTDELAY (see below)
49 | *
50 | * The first 96 samples will be attenuated, so using a value less than 96
51 | * will result in corrupt data for the first 96-ENCDELAY samples.
52 | *
53 | * suggested: 576
54 | * set to 1160 to sync with FhG.
55 | */
56 |
57 | #define ENCDELAY 576
58 |
59 |
60 |
61 | /*
62 | * make sure there is at least one complete frame after the
63 | * last frame containing real data
64 | *
65 | * Using a value of 288 would be sufficient for a
66 | * a very sophisticated decoder that can decode granule-by-granule instead
67 | * of frame by frame. But lets not assume this, and assume the decoder
68 | * will not decode frame N unless it also has data for frame N+1
69 | *
70 | */
71 | /*#define POSTDELAY 288*/
72 | #define POSTDELAY 1152
73 |
74 |
75 |
76 | /*
77 | * delay of the MDCT used in mdct.c
78 | * original ISO routines had a delay of 528!
79 | * Takehiro's routines:
80 | */
81 |
82 | #define MDCTDELAY 48
83 | #define FFTOFFSET (224+MDCTDELAY)
84 |
85 | /*
86 | * Most decoders, including the one we use, have a delay of 528 samples.
87 | */
88 |
89 | #define DECDELAY 528
90 |
91 |
92 | /* number of subbands */
93 | #define SBLIMIT 32
94 |
95 | /* parition bands bands */
96 | #define CBANDS 64
97 |
98 | /* number of critical bands/scale factor bands where masking is computed*/
99 | #define SBPSY_l 21
100 | #define SBPSY_s 12
101 |
102 | /* total number of scalefactor bands encoded */
103 | #define SBMAX_l 22
104 | #define SBMAX_s 13
105 | #define PSFB21 6
106 | #define PSFB12 6
107 |
108 |
109 |
110 | /* FFT sizes */
111 | #define BLKSIZE 1024
112 | #define HBLKSIZE (BLKSIZE/2 + 1)
113 | #define BLKSIZE_s 256
114 | #define HBLKSIZE_s (BLKSIZE_s/2 + 1)
115 |
116 |
117 | /* #define switch_pe 1800 */
118 | #define NORM_TYPE 0
119 | #define START_TYPE 1
120 | #define SHORT_TYPE 2
121 | #define STOP_TYPE 3
122 |
123 | /*
124 | * Mode Extention:
125 | * When we are in stereo mode, there are 4 possible methods to store these
126 | * two channels. The stereo modes -m? are using a subset of them.
127 | *
128 | * -ms: MPG_MD_LR_LR
129 | * -mj: MPG_MD_LR_LR and MPG_MD_MS_LR
130 | * -mf: MPG_MD_MS_LR
131 | * -mi: all
132 | */
133 | #if 0
134 | #define MPG_MD_LR_LR 0
135 | #define MPG_MD_LR_I 1
136 | #define MPG_MD_MS_LR 2
137 | #define MPG_MD_MS_I 3
138 | #endif
139 | enum MPEGChannelMode
140 | { MPG_MD_LR_LR = 0
141 | , MPG_MD_LR_I = 1
142 | , MPG_MD_MS_LR = 2
143 | , MPG_MD_MS_I = 3
144 | };
145 |
146 | #ifndef lame_internal_flags_defined
147 | #define lame_internal_flags_defined
148 | struct lame_internal_flags;
149 | typedef struct lame_internal_flags lame_internal_flags;
150 | #endif
151 |
152 | int lame_encode_mp3_frame(lame_internal_flags * gfc,
153 | sample_t const *inbuf_l,
154 | sample_t const *inbuf_r, unsigned char *mp3buf, int mp3buf_size);
155 |
156 | #endif /* LAME_ENCODER_H */
157 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/fft.c:
--------------------------------------------------------------------------------
1 | /*
2 | ** FFT and FHT routines
3 | ** Copyright 1988, 1993; Ron Mayer
4 | ** Copyright (c) 1999-2000 Takehiro Tominaga
5 | **
6 | ** fht(fz,n);
7 | ** Does a hartley transform of "n" points in the array "fz".
8 | **
9 | ** NOTE: This routine uses at least 2 patented algorithms, and may be
10 | ** under the restrictions of a bunch of different organizations.
11 | ** Although I wrote it completely myself; it is kind of a derivative
12 | ** of a routine I once authored and released under the GPL, so it
13 | ** may fall under the free software foundation's restrictions;
14 | ** it was worked on as a Stanford Univ project, so they claim
15 | ** some rights to it; it was further optimized at work here, so
16 | ** I think this company claims parts of it. The patents are
17 | ** held by R. Bracewell (the FHT algorithm) and O. Buneman (the
18 | ** trig generator), both at Stanford Univ.
19 | ** If it were up to me, I'd say go do whatever you want with it;
20 | ** but it would be polite to give credit to the following people
21 | ** if you use this anywhere:
22 | ** Euler - probable inventor of the fourier transform.
23 | ** Gauss - probable inventor of the FFT.
24 | ** Hartley - probable inventor of the hartley transform.
25 | ** Buneman - for a really cool trig generator
26 | ** Mayer(me) - for authoring this particular version and
27 | ** including all the optimizations in one package.
28 | ** Thanks,
29 | ** Ron Mayer; mayer@acuson.com
30 | ** and added some optimization by
31 | ** Mather - idea of using lookup table
32 | ** Takehiro - some dirty hack for speed up
33 | */
34 |
35 | /* $Id: fft.c,v 1.38 2009/04/20 21:48:00 robert Exp $ */
36 |
37 | #ifdef HAVE_CONFIG_H
38 | # include
39 | #endif
40 |
41 | #include "lame.h"
42 | #include "machine.h"
43 | #include "encoder.h"
44 | #include "util.h"
45 | #include "fft.h"
46 |
47 | #include "vector/lame_intrin.h"
48 |
49 |
50 |
51 | #define TRI_SIZE (5-1) /* 1024 = 4**5 */
52 |
53 | /* fft.c */
54 | static FLOAT window[BLKSIZE], window_s[BLKSIZE_s / 2];
55 |
56 | static const FLOAT costab[TRI_SIZE * 2] = {
57 | 9.238795325112867e-01, 3.826834323650898e-01,
58 | 9.951847266721969e-01, 9.801714032956060e-02,
59 | 9.996988186962042e-01, 2.454122852291229e-02,
60 | 9.999811752826011e-01, 6.135884649154475e-03
61 | };
62 |
63 | static void
64 | fht(FLOAT * fz, int n)
65 | {
66 | const FLOAT *tri = costab;
67 | int k4;
68 | FLOAT *fi, *gi;
69 | FLOAT const *fn;
70 |
71 | n <<= 1; /* to get BLKSIZE, because of 3DNow! ASM routine */
72 | fn = fz + n;
73 | k4 = 4;
74 | do {
75 | FLOAT s1, c1;
76 | int i, k1, k2, k3, kx;
77 | kx = k4 >> 1;
78 | k1 = k4;
79 | k2 = k4 << 1;
80 | k3 = k2 + k1;
81 | k4 = k2 << 1;
82 | fi = fz;
83 | gi = fi + kx;
84 | do {
85 | FLOAT f0, f1, f2, f3;
86 | f1 = fi[0] - fi[k1];
87 | f0 = fi[0] + fi[k1];
88 | f3 = fi[k2] - fi[k3];
89 | f2 = fi[k2] + fi[k3];
90 | fi[k2] = f0 - f2;
91 | fi[0] = f0 + f2;
92 | fi[k3] = f1 - f3;
93 | fi[k1] = f1 + f3;
94 | f1 = gi[0] - gi[k1];
95 | f0 = gi[0] + gi[k1];
96 | f3 = SQRT2 * gi[k3];
97 | f2 = SQRT2 * gi[k2];
98 | gi[k2] = f0 - f2;
99 | gi[0] = f0 + f2;
100 | gi[k3] = f1 - f3;
101 | gi[k1] = f1 + f3;
102 | gi += k4;
103 | fi += k4;
104 | } while (fi < fn);
105 | c1 = tri[0];
106 | s1 = tri[1];
107 | for (i = 1; i < kx; i++) {
108 | FLOAT c2, s2;
109 | c2 = 1 - (2 * s1) * s1;
110 | s2 = (2 * s1) * c1;
111 | fi = fz + i;
112 | gi = fz + k1 - i;
113 | do {
114 | FLOAT a, b, g0, f0, f1, g1, f2, g2, f3, g3;
115 | b = s2 * fi[k1] - c2 * gi[k1];
116 | a = c2 * fi[k1] + s2 * gi[k1];
117 | f1 = fi[0] - a;
118 | f0 = fi[0] + a;
119 | g1 = gi[0] - b;
120 | g0 = gi[0] + b;
121 | b = s2 * fi[k3] - c2 * gi[k3];
122 | a = c2 * fi[k3] + s2 * gi[k3];
123 | f3 = fi[k2] - a;
124 | f2 = fi[k2] + a;
125 | g3 = gi[k2] - b;
126 | g2 = gi[k2] + b;
127 | b = s1 * f2 - c1 * g3;
128 | a = c1 * f2 + s1 * g3;
129 | fi[k2] = f0 - a;
130 | fi[0] = f0 + a;
131 | gi[k3] = g1 - b;
132 | gi[k1] = g1 + b;
133 | b = c1 * g2 - s1 * f3;
134 | a = s1 * g2 + c1 * f3;
135 | gi[k2] = g0 - a;
136 | gi[0] = g0 + a;
137 | fi[k3] = f1 - b;
138 | fi[k1] = f1 + b;
139 | gi += k4;
140 | fi += k4;
141 | } while (fi < fn);
142 | c2 = c1;
143 | c1 = c2 * tri[0] - s1 * tri[1];
144 | s1 = c2 * tri[1] + s1 * tri[0];
145 | }
146 | tri += 2;
147 | } while (k4 < n);
148 | }
149 |
150 |
151 | static const unsigned char rv_tbl[] = {
152 | 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
153 | 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
154 | 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
155 | 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
156 | 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
157 | 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
158 | 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
159 | 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
160 | 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
161 | 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
162 | 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
163 | 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
164 | 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
165 | 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
166 | 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
167 | 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe
168 | };
169 |
170 | #define ch01(index) (buffer[chn][index])
171 |
172 | #define ml00(f) (window[i ] * f(i))
173 | #define ml10(f) (window[i + 0x200] * f(i + 0x200))
174 | #define ml20(f) (window[i + 0x100] * f(i + 0x100))
175 | #define ml30(f) (window[i + 0x300] * f(i + 0x300))
176 |
177 | #define ml01(f) (window[i + 0x001] * f(i + 0x001))
178 | #define ml11(f) (window[i + 0x201] * f(i + 0x201))
179 | #define ml21(f) (window[i + 0x101] * f(i + 0x101))
180 | #define ml31(f) (window[i + 0x301] * f(i + 0x301))
181 |
182 | #define ms00(f) (window_s[i ] * f(i + k))
183 | #define ms10(f) (window_s[0x7f - i] * f(i + k + 0x80))
184 | #define ms20(f) (window_s[i + 0x40] * f(i + k + 0x40))
185 | #define ms30(f) (window_s[0x3f - i] * f(i + k + 0xc0))
186 |
187 | #define ms01(f) (window_s[i + 0x01] * f(i + k + 0x01))
188 | #define ms11(f) (window_s[0x7e - i] * f(i + k + 0x81))
189 | #define ms21(f) (window_s[i + 0x41] * f(i + k + 0x41))
190 | #define ms31(f) (window_s[0x3e - i] * f(i + k + 0xc1))
191 |
192 |
193 | void
194 | fft_short(lame_internal_flags const *const gfc,
195 | FLOAT x_real[3][BLKSIZE_s], int chn, const sample_t *const buffer[2])
196 | {
197 | int i;
198 | int j;
199 | int b;
200 |
201 | for (b = 0; b < 3; b++) {
202 | FLOAT *x = &x_real[b][BLKSIZE_s / 2];
203 | short const k = (576 / 3) * (b + 1);
204 | j = BLKSIZE_s / 8 - 1;
205 | do {
206 | FLOAT f0, f1, f2, f3, w;
207 |
208 | i = rv_tbl[j << 2];
209 |
210 | f0 = ms00(ch01);
211 | w = ms10(ch01);
212 | f1 = f0 - w;
213 | f0 = f0 + w;
214 | f2 = ms20(ch01);
215 | w = ms30(ch01);
216 | f3 = f2 - w;
217 | f2 = f2 + w;
218 |
219 | x -= 4;
220 | x[0] = f0 + f2;
221 | x[2] = f0 - f2;
222 | x[1] = f1 + f3;
223 | x[3] = f1 - f3;
224 |
225 | f0 = ms01(ch01);
226 | w = ms11(ch01);
227 | f1 = f0 - w;
228 | f0 = f0 + w;
229 | f2 = ms21(ch01);
230 | w = ms31(ch01);
231 | f3 = f2 - w;
232 | f2 = f2 + w;
233 |
234 | x[BLKSIZE_s / 2 + 0] = f0 + f2;
235 | x[BLKSIZE_s / 2 + 2] = f0 - f2;
236 | x[BLKSIZE_s / 2 + 1] = f1 + f3;
237 | x[BLKSIZE_s / 2 + 3] = f1 - f3;
238 | } while (--j >= 0);
239 |
240 | gfc->fft_fht(x, BLKSIZE_s / 2);
241 | /* BLKSIZE_s/2 because of 3DNow! ASM routine */
242 | }
243 | }
244 |
245 | void
246 | fft_long(lame_internal_flags const *const gfc,
247 | FLOAT x[BLKSIZE], int chn, const sample_t *const buffer[2])
248 | {
249 | int i;
250 | int jj = BLKSIZE / 8 - 1;
251 | x += BLKSIZE / 2;
252 |
253 | do {
254 | FLOAT f0, f1, f2, f3, w;
255 |
256 | i = rv_tbl[jj];
257 | f0 = ml00(ch01);
258 | w = ml10(ch01);
259 | f1 = f0 - w;
260 | f0 = f0 + w;
261 | f2 = ml20(ch01);
262 | w = ml30(ch01);
263 | f3 = f2 - w;
264 | f2 = f2 + w;
265 |
266 | x -= 4;
267 | x[0] = f0 + f2;
268 | x[2] = f0 - f2;
269 | x[1] = f1 + f3;
270 | x[3] = f1 - f3;
271 |
272 | f0 = ml01(ch01);
273 | w = ml11(ch01);
274 | f1 = f0 - w;
275 | f0 = f0 + w;
276 | f2 = ml21(ch01);
277 | w = ml31(ch01);
278 | f3 = f2 - w;
279 | f2 = f2 + w;
280 |
281 | x[BLKSIZE / 2 + 0] = f0 + f2;
282 | x[BLKSIZE / 2 + 2] = f0 - f2;
283 | x[BLKSIZE / 2 + 1] = f1 + f3;
284 | x[BLKSIZE / 2 + 3] = f1 - f3;
285 | } while (--jj >= 0);
286 |
287 | gfc->fft_fht(x, BLKSIZE / 2);
288 | /* BLKSIZE/2 because of 3DNow! ASM routine */
289 | }
290 |
291 | #ifdef HAVE_NASM
292 | extern void fht_3DN(FLOAT * fz, int n);
293 | extern void fht_SSE(FLOAT * fz, int n);
294 | #endif
295 |
296 | void
297 | init_fft(lame_internal_flags * const gfc)
298 | {
299 | int i;
300 |
301 | /* The type of window used here will make no real difference, but */
302 | /* in the interest of merging nspsytune stuff - switch to blackman window */
303 | for (i = 0; i < BLKSIZE; i++)
304 | /* blackman window */
305 | window[i] = 0.42 - 0.5 * cos(2 * PI * (i + .5) / BLKSIZE) +
306 | 0.08 * cos(4 * PI * (i + .5) / BLKSIZE);
307 |
308 | for (i = 0; i < BLKSIZE_s / 2; i++)
309 | window_s[i] = 0.5 * (1.0 - cos(2.0 * PI * (i + 0.5) / BLKSIZE_s));
310 |
311 | gfc->fft_fht = fht;
312 | #ifdef HAVE_NASM
313 | if (gfc->CPU_features.AMD_3DNow) {
314 | gfc->fft_fht = fht_3DN;
315 | }
316 | else if (gfc->CPU_features.SSE) {
317 | gfc->fft_fht = fht_SSE;
318 | }
319 | else {
320 | gfc->fft_fht = fht;
321 | }
322 | #else
323 | #ifdef HAVE_XMMINTRIN_H
324 | #ifdef MIN_ARCH_SSE
325 | gfc->fft_fht = fht_SSE2;
326 | #endif
327 | #endif
328 | #endif
329 | }
330 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/fft.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Fast Fourier Transform include file
3 | *
4 | * Copyright (c) 2000 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_FFT_H
23 | #define LAME_FFT_H
24 |
25 | void fft_long(lame_internal_flags const *const gfc, FLOAT x_real[BLKSIZE],
26 | int chn, const sample_t *const data[2]);
27 |
28 | void fft_short(lame_internal_flags const *const gfc, FLOAT x_real[3][BLKSIZE_s],
29 | int chn, const sample_t *const data[2]);
30 |
31 | void init_fft(lame_internal_flags * const gfc);
32 |
33 | #endif
34 |
35 | /* End of fft.h */
36 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/gain_analysis.h:
--------------------------------------------------------------------------------
1 | /*
2 | * ReplayGainAnalysis - analyzes input samples and give the recommended dB change
3 | * Copyright (C) 2001 David Robinson and Glen Sawyer
4 | *
5 | * This library is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU Lesser General Public
7 | * License as published by the Free Software Foundation; either
8 | * version 2.1 of the License, or (at your option) any later version.
9 | *
10 | * This library is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 | * Lesser General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU Lesser General Public
16 | * License along with this library; if not, write to the Free Software
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 | *
19 | * concept and filter values by David Robinson (David@Robinson.org)
20 | * -- blame him if you think the idea is flawed
21 | * coding by Glen Sawyer (mp3gain@hotmail.com) 735 W 255 N, Orem, UT 84057-4505 USA
22 | * -- blame him if you think this runs too slowly, or the coding is otherwise flawed
23 | *
24 | * For an explanation of the concepts and the basic algorithms involved, go to:
25 | * http://www.replaygain.org/
26 | */
27 |
28 | #ifndef GAIN_ANALYSIS_H
29 | #define GAIN_ANALYSIS_H
30 |
31 | #ifdef HAVE_INTTYPES_H
32 | # include
33 | #else
34 | # ifdef HAVE_STDINT_H
35 | # include
36 | # endif
37 | #endif
38 |
39 | #ifdef __cplusplus
40 | extern "C" {
41 | #endif
42 |
43 |
44 | typedef sample_t Float_t; /* Type used for filtering */
45 |
46 |
47 | #define PINK_REF 64.82 /* 298640883795 */ /* calibration value for 89dB */
48 |
49 |
50 | #define YULE_ORDER 10
51 | #define BUTTER_ORDER 2
52 | #define YULE_FILTER filterYule
53 | #define BUTTER_FILTER filterButter
54 | #define RMS_PERCENTILE 0.95 /* percentile which is louder than the proposed level */
55 | #define MAX_SAMP_FREQ 48000L /* maximum allowed sample frequency [Hz] */
56 | #define RMS_WINDOW_TIME_NUMERATOR 1L
57 | #define RMS_WINDOW_TIME_DENOMINATOR 20L /* numerator / denominator = time slice size [s] */
58 | #define STEPS_per_dB 100 /* Table entries per dB */
59 | #define MAX_dB 120 /* Table entries for 0...MAX_dB (normal max. values are 70...80 dB) */
60 |
61 | enum { GAIN_NOT_ENOUGH_SAMPLES = -24601, GAIN_ANALYSIS_ERROR = 0, GAIN_ANALYSIS_OK =
62 | 1, INIT_GAIN_ANALYSIS_ERROR = 0, INIT_GAIN_ANALYSIS_OK = 1
63 | };
64 |
65 | enum { MAX_ORDER = (BUTTER_ORDER > YULE_ORDER ? BUTTER_ORDER : YULE_ORDER)
66 | , MAX_SAMPLES_PER_WINDOW = ((MAX_SAMP_FREQ * RMS_WINDOW_TIME_NUMERATOR) / RMS_WINDOW_TIME_DENOMINATOR + 1) /* max. Samples per Time slice */
67 | };
68 |
69 | struct replaygain_data {
70 | Float_t linprebuf[MAX_ORDER * 2];
71 | Float_t *linpre; /* left input samples, with pre-buffer */
72 | Float_t lstepbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER];
73 | Float_t *lstep; /* left "first step" (i.e. post first filter) samples */
74 | Float_t loutbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER];
75 | Float_t *lout; /* left "out" (i.e. post second filter) samples */
76 | Float_t rinprebuf[MAX_ORDER * 2];
77 | Float_t *rinpre; /* right input samples ... */
78 | Float_t rstepbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER];
79 | Float_t *rstep;
80 | Float_t routbuf[MAX_SAMPLES_PER_WINDOW + MAX_ORDER];
81 | Float_t *rout;
82 | long sampleWindow; /* number of samples required to reach number of milliseconds required for RMS window */
83 | long totsamp;
84 | double lsum;
85 | double rsum;
86 | int freqindex;
87 | int first;
88 | uint32_t A[STEPS_per_dB * MAX_dB];
89 | uint32_t B[STEPS_per_dB * MAX_dB];
90 |
91 | };
92 | #ifndef replaygain_data_defined
93 | #define replaygain_data_defined
94 | typedef struct replaygain_data replaygain_t;
95 | #endif
96 |
97 |
98 |
99 |
100 | int InitGainAnalysis(replaygain_t * rgData, long samplefreq);
101 | int AnalyzeSamples(replaygain_t * rgData, const Float_t * left_samples,
102 | const Float_t * right_samples, size_t num_samples, int num_channels);
103 | Float_t GetTitleGain(replaygain_t * rgData);
104 |
105 |
106 | #ifdef __cplusplus
107 | }
108 | #endif
109 | #endif /* GAIN_ANALYSIS_H */
110 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/i386/nasm.h:
--------------------------------------------------------------------------------
1 |
2 | ; Copyright (C) 1999 URURI
3 |
4 | ; nasm�ѥޥ���
5 | ; 1999/08/21 ���
6 | ; 1999/10/10 ���Ĥ��ɲ�
7 | ; 1999/10/27 aout�б�
8 | ; 1999/11/07 pushf, popf ��NASM�ΥХ��б�
9 | ; 1999/12/02 for BCC ( Thanks to Miquel )
10 |
11 | ; for Windows Visual C++ -> define WIN32
12 | ; Borland or cygwin -> WIN32 and COFF
13 | ; for FreeBSD 2.x -> AOUT
14 | ; for TownsOS -> __tos__
15 | ; otherwise -> none
16 |
17 | ;̾����դ���
18 |
19 | BITS 32
20 |
21 | section .note.GNU-stack noalloc noexec nowrite progbits
22 |
23 | %ifdef YASM
24 | %define segment_code segment .text align=16 use32
25 | %define segment_data segment .data align=16 use32
26 | %define segment_bss segment .bss align=16 use32
27 | %elifdef WIN32
28 | %define segment_code segment .text align=16 class=CODE use32
29 | %define segment_data segment .data align=16 class=DATA use32
30 | %ifdef __BORLANDC__
31 | %define segment_bss segment .data align=16 class=DATA use32
32 | %else
33 | %define segment_bss segment .bss align=16 class=DATA use32
34 | %endif
35 | %elifdef AOUT
36 | %define _NAMING
37 | %define segment_code segment .text
38 | %define segment_data segment .data
39 | %define segment_bss segment .bss
40 | %else
41 | %ifidn __OUTPUT_FORMAT__,elf
42 | section .note.GNU-stack progbits noalloc noexec nowrite align=1
43 | %endif
44 | %define segment_code segment .text align=16 class=CODE use32
45 | %define segment_data segment .data align=16 class=DATA use32
46 | %define segment_bss segment .bss align=16 class=DATA use32
47 | %endif
48 |
49 | %ifdef WIN32
50 | %define _NAMING
51 | %endif
52 |
53 | %ifdef __tos__
54 | group CGROUP text
55 | group DGROUP data
56 | %endif
57 |
58 | ;ñ�����ư��������
59 |
60 | %idefine float dword
61 | %idefine fsize 4
62 | %idefine fsizen(a) (fsize*(a))
63 |
64 | ;��ɷ��
65 |
66 | %idefine wsize 2
67 | %idefine wsizen(a) (wsize*(a))
68 | %idefine dwsize 4
69 | %idefine dwsizen(a) (dwsize*(a))
70 |
71 | ;REG
72 |
73 | %define r0 eax
74 | %define r1 ebx
75 | %define r2 ecx
76 | %define r3 edx
77 | %define r4 esi
78 | %define r5 edi
79 | %define r6 ebp
80 | %define r7 esp
81 |
82 | ;MMX,3DNow!,SSE
83 |
84 | %define pmov movq
85 | %define pmovd movd
86 |
87 | %define pupldq punpckldq
88 | %define puphdq punpckhdq
89 | %define puplwd punpcklwd
90 | %define puphwd punpckhwd
91 |
92 | %define xm0 xmm0
93 | %define xm1 xmm1
94 | %define xm2 xmm2
95 | %define xm3 xmm3
96 | %define xm4 xmm4
97 | %define xm5 xmm5
98 | %define xm6 xmm6
99 | %define xm7 xmm7
100 |
101 | ;�����åե��Ѥ�4�ʥޥ���
102 |
103 | %define R4(a,b,c,d) (a*64+b*16+c*4+d)
104 |
105 | ;C�饤���ʴʰץޥ���
106 |
107 | %imacro globaldef 1
108 | %ifdef _NAMING
109 | %define %1 _%1
110 | %endif
111 | global %1
112 | %endmacro
113 |
114 | %imacro externdef 1
115 | %ifdef _NAMING
116 | %define %1 _%1
117 | %endif
118 | extern %1
119 | %endmacro
120 |
121 | %imacro proc 1
122 | %push proc
123 | %ifdef _NAMING
124 | global _%1
125 | %else
126 | global %1
127 | %endif
128 |
129 | align 32
130 | %1:
131 | _%1:
132 |
133 | %assign %$STACK 0
134 | %assign %$STACKN 0
135 | %assign %$ARG 4
136 | %endmacro
137 |
138 | %imacro endproc 0
139 | %ifnctx proc
140 | %error expected 'proc' before 'endproc'.
141 | %else
142 | %if %$STACK > 0
143 | add esp, %$STACK
144 | %endif
145 |
146 | %if %$STACK <> (-%$STACKN)
147 | %error STACKLEVEL mismatch check 'local', 'alloc', 'pushd', 'popd'
148 | %endif
149 |
150 | ret
151 | %pop
152 | %endif
153 | %endmacro
154 |
155 | %idefine sp(a) esp+%$STACK+a
156 |
157 | %imacro arg 1
158 | %00 equ %$ARG
159 | %assign %$ARG %$ARG+%1
160 | %endmacro
161 |
162 | %imacro local 1
163 | %assign %$STACKN %$STACKN-%1
164 | %00 equ %$STACKN
165 | %endmacro
166 |
167 | %imacro alloc 0
168 | sub esp, (-%$STACKN)-%$STACK
169 | %assign %$STACK (-%$STACKN)
170 | %endmacro
171 |
172 | %imacro pushd 1-*
173 | %rep %0
174 | push %1
175 | %assign %$STACK %$STACK+4
176 | %rotate 1
177 | %endrep
178 | %endmacro
179 |
180 | %imacro popd 1-*
181 | %rep %0
182 | %rotate -1
183 | pop %1
184 | %assign %$STACK %$STACK-4
185 | %endrep
186 | %endmacro
187 |
188 | ; bug of NASM-0.98
189 | %define pushf db 0x66, 0x9C
190 | %define popf db 0x66, 0x9D
191 |
192 | %define ge16(n) ((((n) / 16)*0xFFFFFFFF) & 0xFFFFFFFF)
193 | %define ge15(n) ((((n) / 15)*0xFFFFFFFF) & 0xFFFFFFFF)
194 | %define ge14(n) ((((n) / 14)*0xFFFFFFFF) & 0xFFFFFFFF)
195 | %define ge13(n) ((((n) / 13)*0xFFFFFFFF) & 0xFFFFFFFF)
196 | %define ge12(n) ((((n) / 12)*0xFFFFFFFF) & 0xFFFFFFFF)
197 | %define ge11(n) ((((n) / 11)*0xFFFFFFFF) & 0xFFFFFFFF)
198 | %define ge10(n) ((((n) / 10)*0xFFFFFFFF) & 0xFFFFFFFF)
199 | %define ge9(n) ((((n) / 9)*0xFFFFFFFF) & 0xFFFFFFFF)
200 | %define ge8(n) (ge9(n) | ((((n) / 8)*0xFFFFFFFF) & 0xFFFFFFFF))
201 | %define ge7(n) (ge9(n) | ((((n) / 7)*0xFFFFFFFF) & 0xFFFFFFFF))
202 | %define ge6(n) (ge9(n) | ((((n) / 6)*0xFFFFFFFF) & 0xFFFFFFFF))
203 | %define ge5(n) (ge9(n) | ((((n) / 5)*0xFFFFFFFF) & 0xFFFFFFFF))
204 | %define ge4(n) (ge5(n) | ((((n) / 4)*0xFFFFFFFF) & 0xFFFFFFFF))
205 | %define ge3(n) (ge5(n) | ((((n) / 3)*0xFFFFFFFF) & 0xFFFFFFFF))
206 | %define ge2(n) (ge3(n) | ((((n) / 2)*0xFFFFFFFF) & 0xFFFFFFFF))
207 | %define ge1(n) (ge2(n) | ((((n) / 1)*0xFFFFFFFF) & 0xFFFFFFFF))
208 |
209 | ; macro to align for begining of loop
210 | ; %1 does not align if it LE bytes to next alignment
211 | ; 4..16
212 | ; default is 12
213 |
214 | %imacro loopalignK6 0-1 12
215 | %%here:
216 | times (($$-%%here) & 15 & ge1(($$-%%here) & 15) & ~ge4(($$-%%here) & 15)) nop
217 | times (1 & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) jmp short %%skip
218 | times (((($$-%%here) & 15)-2) & ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop
219 | %%skip:
220 | %endmacro
221 |
222 | %imacro loopalignK7 0-1 12
223 | %%here:
224 | times (1 & ge1(($$-%%here) & 15) & ~ge2(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) nop
225 | times (1 & ge2(($$-%%here) & 15) & ~ge3(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Bh,0C0h
226 | times (1 & ge3(($$-%%here) & 15) & ~ge4(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,020h
227 | times (1 & ge4(($$-%%here) & 15) & ~ge5(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h
228 | times (1 & ge5(($$-%%here) & 15) & ~ge6(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,044h,020h,000h,090h
229 | times (1 & ge6(($$-%%here) & 15) & ~ge7(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,080h,0,0,0,0
230 | times (1 & ge7(($$-%%here) & 15) & ~ge8(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0
231 | times (1 & ge8(($$-%%here) & 15) & ~ge9(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 08Dh,004h,005h,0,0,0,0,90h
232 | times (1 & ge9(($$-%%here) & 15) & ~ge10(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,007h,90h,90h,90h,90h,90h,90h,90h
233 | times (1 & ge10(($$-%%here) & 15) & ~ge11(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,008h,90h,90h,90h,90h,90h,90h,90h,90h
234 | times (1 & ge11(($$-%%here) & 15) & ~ge12(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,009h,90h,90h,90h,90h,90h,90h,90h,90h,90h
235 | times (1 & ge12(($$-%%here) & 15) & ~ge13(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Ah,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
236 | times (1 & ge13(($$-%%here) & 15) & ~ge14(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Bh,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
237 | times (1 & ge14(($$-%%here) & 15) & ~ge15(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Ch,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
238 | times (1 & ge15(($$-%%here) & 15) & ~ge16(($$-%%here) & 15) & ~ge%1(($$-%%here) & 15)) DB 0EBh,00Dh,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h,90h
239 | %%skip:
240 | %endmacro
241 |
242 | %imacro loopalign 0-1 12
243 | loopalignK7 %1
244 | %endmacro
245 | %define PACK(x,y,z,w) (x*64+y*16+z*4+w)
246 |
247 | %ifidn __OUTPUT_FORMAT__,elf
248 |
249 | %idefine PIC_BASE(A) _GLOBAL_OFFSET_TABLE_ + $$ - $ wrt ..gotpc
250 | %idefine PIC_EBP_REL(A) ebp + A wrt ..gotoff
251 | %macro PIC_OFFSETTABLE 0
252 | extern _GLOBAL_OFFSET_TABLE_
253 | get_pc.bp:
254 | mov ebp, [esp]
255 | retn
256 | %endmacro
257 |
258 | %else
259 |
260 | %define PIC_BASE(A) (0)
261 | %define PIC_EBP_REL(A) (A)
262 | %macro PIC_OFFSETTABLE 0
263 | get_pc.bp:
264 | mov ebp, [esp]
265 | retn
266 | %endmacro
267 |
268 | %endif
269 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/id3tag.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef LAME_ID3_H
3 | #define LAME_ID3_H
4 |
5 |
6 | #define CHANGED_FLAG (1U << 0)
7 | #define ADD_V2_FLAG (1U << 1)
8 | #define V1_ONLY_FLAG (1U << 2)
9 | #define V2_ONLY_FLAG (1U << 3)
10 | #define SPACE_V1_FLAG (1U << 4)
11 | #define PAD_V2_FLAG (1U << 5)
12 |
13 | enum {
14 | MIMETYPE_NONE = 0,
15 | MIMETYPE_JPEG,
16 | MIMETYPE_PNG,
17 | MIMETYPE_GIF,
18 | };
19 |
20 | typedef struct FrameDataNode {
21 | struct FrameDataNode *nxt;
22 | uint32_t fid; /* Frame Identifier */
23 | char lng[4]; /* 3-character language descriptor */
24 | struct {
25 | union {
26 | char *l; /* ptr to Latin-1 chars */
27 | unsigned short *u; /* ptr to UCS-2 text */
28 | unsigned char *b; /* ptr to raw bytes */
29 | } ptr;
30 | size_t dim;
31 | int enc; /* 0:Latin-1, 1:UCS-2, 2:RAW */
32 | } dsc , txt;
33 | } FrameDataNode;
34 |
35 |
36 | typedef struct id3tag_spec {
37 | /* private data members */
38 | unsigned int flags;
39 | int year;
40 | char *title;
41 | char *artist;
42 | char *album;
43 | char *comment;
44 | int track_id3v1;
45 | int genre_id3v1;
46 | unsigned char *albumart;
47 | unsigned int albumart_size;
48 | unsigned int padding_size;
49 | int albumart_mimetype;
50 | FrameDataNode *v2_head, *v2_tail;
51 | } id3tag_spec;
52 |
53 |
54 | /* write tag into stream at current position */
55 | extern int id3tag_write_v2(lame_global_flags * gfp);
56 | extern int id3tag_write_v1(lame_global_flags * gfp);
57 | /*
58 | * NOTE: A version 2 tag will NOT be added unless one of the text fields won't
59 | * fit in a version 1 tag (e.g. the title string is longer than 30 characters),
60 | * or the "id3tag_add_v2" or "id3tag_v2_only" functions are used.
61 | */
62 |
63 | #endif
64 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/l3side.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Layer 3 side include file
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_L3SIDE_H
23 | #define LAME_L3SIDE_H
24 |
25 | /* max scalefactor band, max(SBMAX_l, SBMAX_s*3, (SBMAX_s-3)*3+8) */
26 | #define SFBMAX (SBMAX_s*3)
27 |
28 | /* Layer III side information. */
29 | typedef struct {
30 | int l[1 + SBMAX_l];
31 | int s[1 + SBMAX_s];
32 | int psfb21[1 + PSFB21];
33 | int psfb12[1 + PSFB12];
34 | } scalefac_struct;
35 |
36 |
37 | typedef struct {
38 | FLOAT l[SBMAX_l];
39 | FLOAT s[SBMAX_s][3];
40 | } III_psy_xmin;
41 |
42 | typedef struct {
43 | III_psy_xmin thm;
44 | III_psy_xmin en;
45 | } III_psy_ratio;
46 |
47 | typedef struct {
48 | FLOAT xr[576];
49 | int l3_enc[576];
50 | int scalefac[SFBMAX];
51 | FLOAT xrpow_max;
52 |
53 | int part2_3_length;
54 | int big_values;
55 | int count1;
56 | int global_gain;
57 | int scalefac_compress;
58 | int block_type;
59 | int mixed_block_flag;
60 | int table_select[3];
61 | int subblock_gain[3 + 1];
62 | int region0_count;
63 | int region1_count;
64 | int preflag;
65 | int scalefac_scale;
66 | int count1table_select;
67 |
68 | int part2_length;
69 | int sfb_lmax;
70 | int sfb_smin;
71 | int psy_lmax;
72 | int sfbmax;
73 | int psymax;
74 | int sfbdivide;
75 | int width[SFBMAX];
76 | int window[SFBMAX];
77 | int count1bits;
78 | /* added for LSF */
79 | const int *sfb_partition_table;
80 | int slen[4];
81 |
82 | int max_nonzero_coeff;
83 | char energy_above_cutoff[SFBMAX];
84 | } gr_info;
85 |
86 | typedef struct {
87 | gr_info tt[2][2];
88 | int main_data_begin;
89 | int private_bits;
90 | int resvDrain_pre;
91 | int resvDrain_post;
92 | int scfsi[2][4];
93 | } III_side_info_t;
94 |
95 | #endif
96 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/lame-analysis.h:
--------------------------------------------------------------------------------
1 | /*
2 | * GTK plotting routines source file
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_GTKANAL_H
23 | #define LAME_GTKANAL_H
24 |
25 |
26 | #define READ_AHEAD 40 /* number of frames to read ahead */
27 | #define MAXMPGLAG READ_AHEAD /* if the mpg123 lag becomes bigger than this
28 | we have to stop */
29 | #define NUMBACK 6 /* number of frames we can back up */
30 | #define NUMPINFO (NUMBACK+READ_AHEAD+1)
31 |
32 |
33 |
34 | struct plotting_data {
35 | int frameNum; /* current frame number */
36 | int frameNum123;
37 | int num_samples; /* number of pcm samples read for this frame */
38 | double frametime; /* starting time of frame, in seconds */
39 | double pcmdata[2][1600];
40 | double pcmdata2[2][1152 + 1152 - DECDELAY];
41 | double xr[2][2][576];
42 | double mpg123xr[2][2][576];
43 | double ms_ratio[2];
44 | double ms_ener_ratio[2];
45 |
46 | /* L,R, M and S values */
47 | double energy_save[4][BLKSIZE]; /* psymodel is one ahead */
48 | double energy[2][4][BLKSIZE];
49 | double pe[2][4];
50 | double thr[2][4][SBMAX_l];
51 | double en[2][4][SBMAX_l];
52 | double thr_s[2][4][3 * SBMAX_s];
53 | double en_s[2][4][3 * SBMAX_s];
54 | double ers_save[4]; /* psymodel is one ahead */
55 | double ers[2][4];
56 |
57 | double sfb[2][2][SBMAX_l];
58 | double sfb_s[2][2][3 * SBMAX_s];
59 | double LAMEsfb[2][2][SBMAX_l];
60 | double LAMEsfb_s[2][2][3 * SBMAX_s];
61 |
62 | int LAMEqss[2][2];
63 | int qss[2][2];
64 | int big_values[2][2];
65 | int sub_gain[2][2][3];
66 |
67 | double xfsf[2][2][SBMAX_l];
68 | double xfsf_s[2][2][3 * SBMAX_s];
69 |
70 | int over[2][2];
71 | double tot_noise[2][2];
72 | double max_noise[2][2];
73 | double over_noise[2][2];
74 | int over_SSD[2][2];
75 | int blocktype[2][2];
76 | int scalefac_scale[2][2];
77 | int preflag[2][2];
78 | int mpg123blocktype[2][2];
79 | int mixed[2][2];
80 | int mainbits[2][2];
81 | int sfbits[2][2];
82 | int LAMEmainbits[2][2];
83 | int LAMEsfbits[2][2];
84 | int framesize, stereo, js, ms_stereo, i_stereo, emph, bitrate, sampfreq, maindata;
85 | int crc, padding;
86 | int scfsi[2], mean_bits, resvsize;
87 | int totbits;
88 | };
89 | #ifndef plotting_data_defined
90 | #define plotting_data_defined
91 | typedef struct plotting_data plotting_data;
92 | #endif
93 | #if 0
94 | extern plotting_data *pinfo;
95 | #endif
96 | #endif
97 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/lame_global_flags.h:
--------------------------------------------------------------------------------
1 | #ifndef LAME_GLOBAL_FLAGS_H
2 | #define LAME_GLOBAL_FLAGS_H
3 |
4 | #ifndef lame_internal_flags_defined
5 | #define lame_internal_flags_defined
6 | struct lame_internal_flags;
7 | typedef struct lame_internal_flags lame_internal_flags;
8 | #endif
9 |
10 |
11 | typedef enum short_block_e {
12 | short_block_not_set = -1, /* allow LAME to decide */
13 | short_block_allowed = 0, /* LAME may use them, even different block types for L/R */
14 | short_block_coupled, /* LAME may use them, but always same block types in L/R */
15 | short_block_dispensed, /* LAME will not use short blocks, long blocks only */
16 | short_block_forced /* LAME will not use long blocks, short blocks only */
17 | } short_block_t;
18 |
19 | /***********************************************************************
20 | *
21 | * Control Parameters set by User. These parameters are here for
22 | * backwards compatibility with the old, non-shared lib API.
23 | * Please use the lame_set_variablename() functions below
24 | *
25 | *
26 | ***********************************************************************/
27 | struct lame_global_struct {
28 | unsigned int class_id;
29 |
30 | /* input description */
31 | unsigned long num_samples; /* number of samples. default=2^32-1 */
32 | int num_channels; /* input number of channels. default=2 */
33 | int samplerate_in; /* input_samp_rate in Hz. default=44.1 kHz */
34 | int samplerate_out; /* output_samp_rate.
35 | default: LAME picks best value
36 | at least not used for MP3 decoding:
37 | Remember 44.1 kHz MP3s and AC97 */
38 | float scale; /* scale input by this amount before encoding
39 | at least not used for MP3 decoding */
40 | float scale_left; /* scale input of channel 0 (left) by this
41 | amount before encoding */
42 | float scale_right; /* scale input of channel 1 (right) by this
43 | amount before encoding */
44 |
45 | /* general control params */
46 | int analysis; /* collect data for a MP3 frame analyzer? */
47 | int write_lame_tag; /* add Xing VBR tag? */
48 | int decode_only; /* use lame/mpglib to convert mp3 to wav */
49 | int quality; /* quality setting 0=best, 9=worst default=5 */
50 | MPEG_mode mode; /* see enum in lame.h
51 | default = LAME picks best value */
52 | int force_ms; /* force M/S mode. requires mode=1 */
53 | int free_format; /* use free format? default=0 */
54 | int findReplayGain; /* find the RG value? default=0 */
55 | int decode_on_the_fly; /* decode on the fly? default=0 */
56 | int write_id3tag_automatic; /* 1 (default) writes ID3 tags, 0 not */
57 |
58 | int nogap_total;
59 | int nogap_current;
60 |
61 | int substep_shaping;
62 | int noise_shaping;
63 | int subblock_gain; /* 0 = no, 1 = yes */
64 | int use_best_huffman; /* 0 = no. 1=outside loop 2=inside loop(slow) */
65 |
66 | /*
67 | * set either brate>0 or compression_ratio>0, LAME will compute
68 | * the value of the variable not set.
69 | * Default is compression_ratio = 11.025
70 | */
71 | int brate; /* bitrate */
72 | float compression_ratio; /* sizeof(wav file)/sizeof(mp3 file) */
73 |
74 |
75 | /* frame params */
76 | int copyright; /* mark as copyright. default=0 */
77 | int original; /* mark as original. default=1 */
78 | int extension; /* the MP3 'private extension' bit.
79 | Meaningless */
80 | int emphasis; /* Input PCM is emphased PCM (for
81 | instance from one of the rarely
82 | emphased CDs), it is STRONGLY not
83 | recommended to use this, because
84 | psycho does not take it into account,
85 | and last but not least many decoders
86 | don't care about these bits */
87 | int error_protection; /* use 2 bytes per frame for a CRC
88 | checksum. default=0 */
89 | int strict_ISO; /* enforce ISO spec as much as possible */
90 |
91 | int disable_reservoir; /* use bit reservoir? */
92 |
93 | /* quantization/noise shaping */
94 | int quant_comp;
95 | int quant_comp_short;
96 | int experimentalY;
97 | int experimentalZ;
98 | int exp_nspsytune;
99 |
100 | int preset;
101 |
102 | /* VBR control */
103 | vbr_mode VBR;
104 | float VBR_q_frac; /* Range [0,...,1[ */
105 | int VBR_q; /* Range [0,...,9] */
106 | int VBR_mean_bitrate_kbps;
107 | int VBR_min_bitrate_kbps;
108 | int VBR_max_bitrate_kbps;
109 | int VBR_hard_min; /* strictly enforce VBR_min_bitrate
110 | normaly, it will be violated for analog
111 | silence */
112 |
113 |
114 | /* resampling and filtering */
115 | int lowpassfreq; /* freq in Hz. 0=lame choses.
116 | -1=no filter */
117 | int highpassfreq; /* freq in Hz. 0=lame choses.
118 | -1=no filter */
119 | int lowpasswidth; /* freq width of filter, in Hz
120 | (default=15%) */
121 | int highpasswidth; /* freq width of filter, in Hz
122 | (default=15%) */
123 |
124 |
125 |
126 | /*
127 | * psycho acoustics and other arguments which you should not change
128 | * unless you know what you are doing
129 | */
130 | float maskingadjust;
131 | float maskingadjust_short;
132 | int ATHonly; /* only use ATH */
133 | int ATHshort; /* only use ATH for short blocks */
134 | int noATH; /* disable ATH */
135 | int ATHtype; /* select ATH formula */
136 | float ATHcurve; /* change ATH formula 4 shape */
137 | float ATH_lower_db; /* lower ATH by this many db */
138 | int athaa_type; /* select ATH auto-adjust scheme */
139 | float athaa_sensitivity; /* dB, tune active region of auto-level */
140 | short_block_t short_blocks;
141 | int useTemporal; /* use temporal masking effect */
142 | float interChRatio;
143 | float msfix; /* Naoki's adjustment of Mid/Side maskings */
144 |
145 | int tune; /* 0 off, 1 on */
146 | float tune_value_a; /* used to pass values for debugging and stuff */
147 |
148 | float attackthre; /* attack threshold for L/R/M channel */
149 | float attackthre_s; /* attack threshold for S channel */
150 |
151 |
152 | struct {
153 | void (*msgf) (const char *format, va_list ap);
154 | void (*debugf) (const char *format, va_list ap);
155 | void (*errorf) (const char *format, va_list ap);
156 | } report;
157 |
158 | /************************************************************************/
159 | /* internal variables, do not set... */
160 | /* provided because they may be of use to calling application */
161 | /************************************************************************/
162 |
163 | int lame_allocated_gfp; /* is this struct owned by calling
164 | program or lame? */
165 |
166 |
167 |
168 | /**************************************************************************/
169 | /* more internal variables are stored in this structure: */
170 | /**************************************************************************/
171 | lame_internal_flags *internal_flags;
172 |
173 |
174 | struct {
175 | int mmx;
176 | int amd3dnow;
177 | int sse;
178 |
179 | } asm_optimizations;
180 | };
181 |
182 | int is_lame_global_flags_valid(const lame_global_flags * gfp);
183 |
184 | #endif /* LAME_GLOBAL_FLAGS_H */
185 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/lameerror.h:
--------------------------------------------------------------------------------
1 | /*
2 | * A collection of LAME Error Codes
3 | *
4 | * Please use the constants defined here instead of some arbitrary
5 | * values. Currently the values starting at -10 to avoid intersection
6 | * with the -1, -2, -3 and -4 used in the current code.
7 | *
8 | * May be this should be a part of the include/lame.h.
9 | */
10 |
11 | typedef enum {
12 | LAME_OKAY = 0,
13 | LAME_NOERROR = 0,
14 | LAME_GENERICERROR = -1,
15 | LAME_NOMEM = -10,
16 | LAME_BADBITRATE = -11,
17 | LAME_BADSAMPFREQ = -12,
18 | LAME_INTERNALERROR = -13,
19 |
20 | FRONTEND_READERROR = -80,
21 | FRONTEND_WRITEERROR = -81,
22 | FRONTEND_FILETOOLARGE = -82,
23 |
24 | } lame_errorcodes_t;
25 |
26 | /* end of lameerror.h */
27 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/machine.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Machine dependent defines/includes for LAME.
3 | *
4 | * Copyright (c) 1999 A.L. Faber
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_MACHINE_H
23 | #define LAME_MACHINE_H
24 |
25 | #include "version.h"
26 |
27 | #if (LAME_RELEASE_VERSION == 0)
28 | #undef NDEBUG
29 | #endif
30 |
31 | #include
32 | #include
33 |
34 | #ifdef STDC_HEADERS
35 | # include
36 | # include
37 | #else
38 | # ifndef HAVE_STRCHR
39 | # define strchr index
40 | # define strrchr rindex
41 | # endif
42 | char *strchr(), *strrchr();
43 | # ifndef HAVE_MEMCPY
44 | # define memcpy(d, s, n) bcopy ((s), (d), (n))
45 | # define memmove(d, s, n) bcopy ((s), (d), (n))
46 | # endif
47 | #endif
48 |
49 | #if defined(__riscos__) && defined(FPA10)
50 | # include "ymath.h"
51 | #else
52 | # include
53 | #endif
54 | #include
55 |
56 | #include
57 |
58 | #ifdef HAVE_ERRNO_H
59 | # include
60 | #endif
61 | #ifdef HAVE_FCNTL_H
62 | # include
63 | #endif
64 |
65 | #if defined(macintosh)
66 | # include
67 | # include
68 | #else
69 | # include
70 | # include
71 | #endif
72 |
73 | #ifdef HAVE_INTTYPES_H
74 | # include
75 | #else
76 | # ifdef HAVE_STDINT_H
77 | # include
78 | # endif
79 | #endif
80 |
81 | #ifdef WITH_DMALLOC
82 | #include
83 | #endif
84 |
85 | /*
86 | * 3 different types of pow() functions:
87 | * - table lookup
88 | * - pow()
89 | * - exp() on some machines this is claimed to be faster than pow()
90 | */
91 |
92 | #define POW20(x) (assert(0 <= (x+Q_MAX2) && x < Q_MAX), pow20[x+Q_MAX2])
93 | /*#define POW20(x) pow(2.0,((double)(x)-210)*.25) */
94 | /*#define POW20(x) exp( ((double)(x)-210)*(.25*LOG2) ) */
95 |
96 | #define IPOW20(x) (assert(0 <= x && x < Q_MAX), ipow20[x])
97 | /*#define IPOW20(x) exp( -((double)(x)-210)*.1875*LOG2 ) */
98 | /*#define IPOW20(x) pow(2.0,-((double)(x)-210)*.1875) */
99 |
100 | /* in case this is used without configure */
101 | #ifndef inline
102 | # define inline
103 | #endif
104 |
105 | #if defined(_MSC_VER)
106 | # undef inline
107 | # define inline _inline
108 | #elif defined(__SASC) || defined(__GNUC__) || defined(__ICC) || defined(__ECC)
109 | /* if __GNUC__ we always want to inline, not only if the user requests it */
110 | # undef inline
111 | # define inline __inline
112 | #endif
113 |
114 | #if defined(_MSC_VER)
115 | # pragma warning( disable : 4244 )
116 | /*# pragma warning( disable : 4305 ) */
117 | #endif
118 |
119 | /*
120 | * FLOAT for variables which require at least 32 bits
121 | * FLOAT8 for variables which require at least 64 bits
122 | *
123 | * On some machines, 64 bit will be faster than 32 bit. Also, some math
124 | * routines require 64 bit float, so setting FLOAT=float will result in a
125 | * lot of conversions.
126 | */
127 |
128 | #if ( defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) )
129 | # define WIN32_LEAN_AND_MEAN
130 | # include
131 | # include
132 | # define FLOAT_MAX FLT_MAX
133 | #else
134 | # ifndef FLOAT
135 | typedef float FLOAT;
136 | # ifdef FLT_MAX
137 | # define FLOAT_MAX FLT_MAX
138 | # else
139 | # define FLOAT_MAX 1e37 /* approx */
140 | # endif
141 | # endif
142 | #endif
143 |
144 | #ifndef FLOAT8
145 | typedef double FLOAT8;
146 | # ifdef DBL_MAX
147 | # define FLOAT8_MAX DBL_MAX
148 | # else
149 | # define FLOAT8_MAX 1e99 /* approx */
150 | # endif
151 | #else
152 | # ifdef FLT_MAX
153 | # define FLOAT8_MAX FLT_MAX
154 | # else
155 | # define FLOAT8_MAX 1e37 /* approx */
156 | # endif
157 | #endif
158 |
159 | /* sample_t must be floating point, at least 32 bits */
160 | typedef FLOAT sample_t;
161 |
162 | #define dimension_of(array) (sizeof(array)/sizeof(array[0]))
163 | #define beyond(array) (array+dimension_of(array))
164 | #define compiletime_assert(expression) extern char static_assert_##FILE##_##LINE[expression?1:0]
165 |
166 | #if 1
167 | #define EQ(a,b) (\
168 | (fabs(a) > fabs(b)) \
169 | ? (fabs((a)-(b)) <= (fabs(a) * 1e-6f)) \
170 | : (fabs((a)-(b)) <= (fabs(b) * 1e-6f)))
171 | #else
172 | #define EQ(a,b) (fabs((a)-(b))<1E-37)
173 | #endif
174 |
175 | #define NEQ(a,b) (!EQ(a,b))
176 |
177 | #endif
178 |
179 | #ifdef _MSC_VER
180 | # if _MSC_VER < 1400
181 | # define fabsf fabs
182 | # define powf pow
183 | # define log10f log10
184 | # endif
185 | #endif
186 |
187 |
188 | /* end of machine.h */
189 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/mpglib_interface.c:
--------------------------------------------------------------------------------
1 | /* -*- mode: C; mode: fold -*- */
2 | /*
3 | * LAME MP3 encoding engine
4 | *
5 | * Copyright (c) 1999-2000 Mark Taylor
6 | * Copyright (c) 2003 Olcios
7 | * Copyright (c) 2008 Robert Hegemann
8 | *
9 | * This library is free software; you can redistribute it and/or
10 | * modify it under the terms of the GNU Library General Public
11 | * License as published by the Free Software Foundation; either
12 | * version 2 of the License, or (at your option) any later version.
13 | *
14 | * This library is distributed in the hope that it will be useful,
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 | * Library General Public License for more details.
18 | *
19 | * You should have received a copy of the GNU Library General Public
20 | * License along with this library; if not, write to the
21 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 | * Boston, MA 02111-1307, USA.
23 | */
24 |
25 | /* $Id: mpglib_interface.c,v 1.42 2011/05/07 16:05:17 rbrito Exp $ */
26 |
27 | #ifdef HAVE_CONFIG_H
28 | # include
29 | #endif
30 |
31 | #ifdef HAVE_MPGLIB
32 | #define hip_global_struct mpstr_tag
33 | #include "lame.h"
34 | #include "machine.h"
35 | #include "encoder.h"
36 | #include "interface.h"
37 |
38 | #include "util.h"
39 |
40 |
41 |
42 | #if DEPRECATED_OR_OBSOLETE_CODE_REMOVED
43 | /*
44 | * OBSOLETE:
45 | * - kept to let it link
46 | * - forward declaration to silence compiler
47 | */
48 | int CDECL lame_decode_init(void);
49 | int CDECL lame_decode(
50 | unsigned char * mp3buf,
51 | int len,
52 | short pcm_l[],
53 | short pcm_r[] );
54 | int CDECL lame_decode_headers(
55 | unsigned char* mp3buf,
56 | int len,
57 | short pcm_l[],
58 | short pcm_r[],
59 | mp3data_struct* mp3data );
60 | int CDECL lame_decode1(
61 | unsigned char* mp3buf,
62 | int len,
63 | short pcm_l[],
64 | short pcm_r[] );
65 | int CDECL lame_decode1_headers(
66 | unsigned char* mp3buf,
67 | int len,
68 | short pcm_l[],
69 | short pcm_r[],
70 | mp3data_struct* mp3data );
71 | int CDECL lame_decode1_headersB(
72 | unsigned char* mp3buf,
73 | int len,
74 | short pcm_l[],
75 | short pcm_r[],
76 | mp3data_struct* mp3data,
77 | int *enc_delay,
78 | int *enc_padding );
79 | int CDECL lame_decode_exit(void);
80 | #endif
81 |
82 |
83 | static MPSTR mp;
84 |
85 | int
86 | lame_decode_exit(void)
87 | {
88 | ExitMP3(&mp);
89 | return 0;
90 | }
91 |
92 |
93 | int
94 | lame_decode_init(void)
95 | {
96 | (void) InitMP3(&mp);
97 | return 0;
98 | }
99 |
100 |
101 |
102 |
103 | /* copy mono samples */
104 | #define COPY_MONO(DST_TYPE, SRC_TYPE) \
105 | DST_TYPE *pcm_l = (DST_TYPE *)pcm_l_raw; \
106 | SRC_TYPE const *p_samples = (SRC_TYPE const *)p; \
107 | for (i = 0; i < processed_samples; i++) \
108 | *pcm_l++ = (DST_TYPE)(*p_samples++);
109 |
110 | /* copy stereo samples */
111 | #define COPY_STEREO(DST_TYPE, SRC_TYPE) \
112 | DST_TYPE *pcm_l = (DST_TYPE *)pcm_l_raw, *pcm_r = (DST_TYPE *)pcm_r_raw; \
113 | SRC_TYPE const *p_samples = (SRC_TYPE const *)p; \
114 | for (i = 0; i < processed_samples; i++) { \
115 | *pcm_l++ = (DST_TYPE)(*p_samples++); \
116 | *pcm_r++ = (DST_TYPE)(*p_samples++); \
117 | }
118 |
119 |
120 |
121 | /*
122 | * For lame_decode: return code
123 | * -1 error
124 | * 0 ok, but need more data before outputing any samples
125 | * n number of samples output. either 576 or 1152 depending on MP3 file.
126 | */
127 |
128 | static int
129 | decode1_headersB_clipchoice(PMPSTR pmp, unsigned char *buffer, int len,
130 | char pcm_l_raw[], char pcm_r_raw[], mp3data_struct * mp3data,
131 | int *enc_delay, int *enc_padding,
132 | char *p, size_t psize, int decoded_sample_size,
133 | int (*decodeMP3_ptr) (PMPSTR, unsigned char *, int, char *, int,
134 | int *))
135 | {
136 | static const int smpls[2][4] = {
137 | /* Layer I II III */
138 | {0, 384, 1152, 1152}, /* MPEG-1 */
139 | {0, 384, 1152, 576} /* MPEG-2(.5) */
140 | };
141 |
142 | int processed_bytes;
143 | int processed_samples; /* processed samples per channel */
144 | int ret;
145 | int i;
146 |
147 | mp3data->header_parsed = 0;
148 |
149 | ret = (*decodeMP3_ptr) (pmp, buffer, len, p, (int) psize, &processed_bytes);
150 | /* three cases:
151 | * 1. headers parsed, but data not complete
152 | * pmp->header_parsed==1
153 | * pmp->framesize=0
154 | * pmp->fsizeold=size of last frame, or 0 if this is first frame
155 | *
156 | * 2. headers, data parsed, but ancillary data not complete
157 | * pmp->header_parsed==1
158 | * pmp->framesize=size of frame
159 | * pmp->fsizeold=size of last frame, or 0 if this is first frame
160 | *
161 | * 3. frame fully decoded:
162 | * pmp->header_parsed==0
163 | * pmp->framesize=0
164 | * pmp->fsizeold=size of frame (which is now the last frame)
165 | *
166 | */
167 | if (pmp->header_parsed || pmp->fsizeold > 0 || pmp->framesize > 0) {
168 | mp3data->header_parsed = 1;
169 | mp3data->stereo = pmp->fr.stereo;
170 | mp3data->samplerate = freqs[pmp->fr.sampling_frequency];
171 | mp3data->mode = pmp->fr.mode;
172 | mp3data->mode_ext = pmp->fr.mode_ext;
173 | mp3data->framesize = smpls[pmp->fr.lsf][pmp->fr.lay];
174 |
175 | /* free format, we need the entire frame before we can determine
176 | * the bitrate. If we haven't gotten the entire frame, bitrate=0 */
177 | if (pmp->fsizeold > 0) /* works for free format and fixed, no overrun, temporal results are < 400.e6 */
178 | mp3data->bitrate = 8 * (4 + pmp->fsizeold) * mp3data->samplerate /
179 | (1.e3 * mp3data->framesize) + 0.5;
180 | else if (pmp->framesize > 0)
181 | mp3data->bitrate = 8 * (4 + pmp->framesize) * mp3data->samplerate /
182 | (1.e3 * mp3data->framesize) + 0.5;
183 | else
184 | mp3data->bitrate = tabsel_123[pmp->fr.lsf][pmp->fr.lay - 1][pmp->fr.bitrate_index];
185 |
186 |
187 |
188 | if (pmp->num_frames > 0) {
189 | /* Xing VBR header found and num_frames was set */
190 | mp3data->totalframes = pmp->num_frames;
191 | mp3data->nsamp = mp3data->framesize * pmp->num_frames;
192 | *enc_delay = pmp->enc_delay;
193 | *enc_padding = pmp->enc_padding;
194 | }
195 | }
196 |
197 | switch (ret) {
198 | case MP3_OK:
199 | switch (pmp->fr.stereo) {
200 | case 1:
201 | processed_samples = processed_bytes / decoded_sample_size;
202 | if (decoded_sample_size == sizeof(short)) {
203 | COPY_MONO(short, short)
204 | }
205 | else {
206 | COPY_MONO(sample_t, FLOAT)
207 | }
208 | break;
209 | case 2:
210 | processed_samples = (processed_bytes / decoded_sample_size) >> 1;
211 | if (decoded_sample_size == sizeof(short)) {
212 | COPY_STEREO(short, short)
213 | }
214 | else {
215 | COPY_STEREO(sample_t, FLOAT)
216 | }
217 | break;
218 | default:
219 | processed_samples = -1;
220 | assert(0);
221 | break;
222 | }
223 | break;
224 |
225 | case MP3_NEED_MORE:
226 | processed_samples = 0;
227 | break;
228 |
229 | case MP3_ERR:
230 | processed_samples = -1;
231 | break;
232 |
233 | default:
234 | processed_samples = -1;
235 | assert(0);
236 | break;
237 | }
238 |
239 | /*fprintf(stderr,"ok, more, err: %i %i %i\n", MP3_OK, MP3_NEED_MORE, MP3_ERR ); */
240 | /*fprintf(stderr,"ret = %i out=%i\n", ret, processed_samples ); */
241 | return processed_samples;
242 | }
243 |
244 |
245 | #define OUTSIZE_CLIPPED (4096*sizeof(short))
246 |
247 | int
248 | lame_decode1_headersB(unsigned char *buffer,
249 | int len,
250 | short pcm_l[], short pcm_r[], mp3data_struct * mp3data,
251 | int *enc_delay, int *enc_padding)
252 | {
253 | static char out[OUTSIZE_CLIPPED];
254 |
255 | return decode1_headersB_clipchoice(&mp, buffer, len, (char *) pcm_l, (char *) pcm_r, mp3data,
256 | enc_delay, enc_padding, out, OUTSIZE_CLIPPED,
257 | sizeof(short), decodeMP3);
258 | }
259 |
260 |
261 |
262 |
263 |
264 | /*
265 | * For lame_decode: return code
266 | * -1 error
267 | * 0 ok, but need more data before outputing any samples
268 | * n number of samples output. Will be at most one frame of
269 | * MPEG data.
270 | */
271 |
272 | int
273 | lame_decode1_headers(unsigned char *buffer,
274 | int len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data)
275 | {
276 | int enc_delay, enc_padding;
277 | return lame_decode1_headersB(buffer, len, pcm_l, pcm_r, mp3data, &enc_delay, &enc_padding);
278 | }
279 |
280 |
281 | int
282 | lame_decode1(unsigned char *buffer, int len, short pcm_l[], short pcm_r[])
283 | {
284 | mp3data_struct mp3data;
285 |
286 | return lame_decode1_headers(buffer, len, pcm_l, pcm_r, &mp3data);
287 | }
288 |
289 |
290 | /*
291 | * For lame_decode: return code
292 | * -1 error
293 | * 0 ok, but need more data before outputing any samples
294 | * n number of samples output. a multiple of 576 or 1152 depending on MP3 file.
295 | */
296 |
297 | int
298 | lame_decode_headers(unsigned char *buffer,
299 | int len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data)
300 | {
301 | int ret;
302 | int totsize = 0; /* number of decoded samples per channel */
303 |
304 | for (;;) {
305 | switch (ret = lame_decode1_headers(buffer, len, pcm_l + totsize, pcm_r + totsize, mp3data)) {
306 | case -1:
307 | return ret;
308 | case 0:
309 | return totsize;
310 | default:
311 | totsize += ret;
312 | len = 0; /* future calls to decodeMP3 are just to flush buffers */
313 | break;
314 | }
315 | }
316 | }
317 |
318 |
319 | int
320 | lame_decode(unsigned char *buffer, int len, short pcm_l[], short pcm_r[])
321 | {
322 | mp3data_struct mp3data;
323 |
324 | return lame_decode_headers(buffer, len, pcm_l, pcm_r, &mp3data);
325 | }
326 |
327 |
328 |
329 |
330 | hip_t hip_decode_init(void)
331 | {
332 | hip_t hip = calloc(1, sizeof(hip_global_flags));
333 | InitMP3(hip);
334 | return hip;
335 | }
336 |
337 |
338 | int hip_decode_exit(hip_t hip)
339 | {
340 | if (hip) {
341 | ExitMP3(hip);
342 | free(hip);
343 | }
344 | return 0;
345 | }
346 |
347 |
348 | /* we forbid input with more than 1152 samples per channel for output in the unclipped mode */
349 | #define OUTSIZE_UNCLIPPED (1152*2*sizeof(FLOAT))
350 |
351 | int
352 | hip_decode1_unclipped(hip_t hip, unsigned char *buffer, size_t len, sample_t pcm_l[], sample_t pcm_r[])
353 | {
354 | static char out[OUTSIZE_UNCLIPPED];
355 | mp3data_struct mp3data;
356 | int enc_delay, enc_padding;
357 |
358 | if (hip) {
359 | return decode1_headersB_clipchoice(hip, buffer, len, (char *) pcm_l, (char *) pcm_r, &mp3data,
360 | &enc_delay, &enc_padding, out, OUTSIZE_UNCLIPPED,
361 | sizeof(FLOAT), decodeMP3_unclipped);
362 | }
363 | return 0;
364 | }
365 |
366 | /*
367 | * For hip_decode: return code
368 | * -1 error
369 | * 0 ok, but need more data before outputing any samples
370 | * n number of samples output. Will be at most one frame of
371 | * MPEG data.
372 | */
373 |
374 | int
375 | hip_decode1_headers(hip_t hip, unsigned char *buffer,
376 | size_t len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data)
377 | {
378 | int enc_delay, enc_padding;
379 | return hip_decode1_headersB(hip, buffer, len, pcm_l, pcm_r, mp3data, &enc_delay, &enc_padding);
380 | }
381 |
382 |
383 | int
384 | hip_decode1(hip_t hip, unsigned char *buffer, size_t len, short pcm_l[], short pcm_r[])
385 | {
386 | mp3data_struct mp3data;
387 | return hip_decode1_headers(hip, buffer, len, pcm_l, pcm_r, &mp3data);
388 | }
389 |
390 |
391 | /*
392 | * For hip_decode: return code
393 | * -1 error
394 | * 0 ok, but need more data before outputing any samples
395 | * n number of samples output. a multiple of 576 or 1152 depending on MP3 file.
396 | */
397 |
398 | int
399 | hip_decode_headers(hip_t hip, unsigned char *buffer,
400 | size_t len, short pcm_l[], short pcm_r[], mp3data_struct * mp3data)
401 | {
402 | int ret;
403 | int totsize = 0; /* number of decoded samples per channel */
404 |
405 | for (;;) {
406 | switch (ret = hip_decode1_headers(hip, buffer, len, pcm_l + totsize, pcm_r + totsize, mp3data)) {
407 | case -1:
408 | return ret;
409 | case 0:
410 | return totsize;
411 | default:
412 | totsize += ret;
413 | len = 0; /* future calls to decodeMP3 are just to flush buffers */
414 | break;
415 | }
416 | }
417 | }
418 |
419 |
420 | int
421 | hip_decode(hip_t hip, unsigned char *buffer, size_t len, short pcm_l[], short pcm_r[])
422 | {
423 | mp3data_struct mp3data;
424 | return hip_decode_headers(hip, buffer, len, pcm_l, pcm_r, &mp3data);
425 | }
426 |
427 |
428 | int
429 | hip_decode1_headersB(hip_t hip, unsigned char *buffer,
430 | size_t len,
431 | short pcm_l[], short pcm_r[], mp3data_struct * mp3data,
432 | int *enc_delay, int *enc_padding)
433 | {
434 | static char out[OUTSIZE_CLIPPED];
435 | if (hip) {
436 | return decode1_headersB_clipchoice(hip, buffer, len, (char *) pcm_l, (char *) pcm_r, mp3data,
437 | enc_delay, enc_padding, out, OUTSIZE_CLIPPED,
438 | sizeof(short), decodeMP3);
439 | }
440 | return -1;
441 | }
442 |
443 |
444 | void hip_set_pinfo(hip_t hip, plotting_data* pinfo)
445 | {
446 | if (hip) {
447 | hip->pinfo = pinfo;
448 | }
449 | }
450 |
451 |
452 |
453 | void hip_set_errorf(hip_t hip, lame_report_function func)
454 | {
455 | if (hip) {
456 | hip->report_err = func;
457 | }
458 | }
459 |
460 | void hip_set_debugf(hip_t hip, lame_report_function func)
461 | {
462 | if (hip) {
463 | hip->report_dbg = func;
464 | }
465 | }
466 |
467 | void hip_set_msgf (hip_t hip, lame_report_function func)
468 | {
469 | if (hip) {
470 | hip->report_msg = func;
471 | }
472 | }
473 |
474 | #endif
475 |
476 | /* end of mpglib_interface.c */
477 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/newmdct.h:
--------------------------------------------------------------------------------
1 | /*
2 | * New Modified DCT include file
3 | *
4 | * Copyright (c) 1999 Takehiro TOMINAGA
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_NEWMDCT_H
23 | #define LAME_NEWMDCT_H
24 |
25 | void mdct_sub48(lame_internal_flags * gfc, const sample_t * w0, const sample_t * w1);
26 |
27 | #endif /* LAME_NEWMDCT_H */
28 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/presets.c:
--------------------------------------------------------------------------------
1 | /*
2 | * presets.c -- Apply presets
3 | *
4 | * Copyright (c) 2002-2008 Gabriel Bouvigne
5 | * Copyright (c) 2007-2011 Robert Hegemann
6 | *
7 | * This library is free software; you can redistribute it and/or
8 | * modify it under the terms of the GNU Library General Public
9 | * License as published by the Free Software Foundation; either
10 | * version 2 of the License, or (at your option) any later version.
11 | *
12 | * This library is distributed in the hope that it will be useful,
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 | * Library General Public License for more details.
16 | *
17 | * You should have received a copy of the GNU Library General Public
18 | * License along with this library; if not, write to the Free Software
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
20 | */
21 |
22 |
23 | #ifdef HAVE_CONFIG_H
24 | # include
25 | #endif
26 |
27 | #include "lame.h"
28 | #include "machine.h"
29 | #include "set_get.h"
30 | #include "encoder.h"
31 | #include "util.h"
32 | #include "lame_global_flags.h"
33 |
34 | #define SET_OPTION(opt, val, def) if (enforce) \
35 | (void) lame_set_##opt(gfp, val); \
36 | else if (!(fabs(lame_get_##opt(gfp) - def) > 0)) \
37 | (void) lame_set_##opt(gfp, val);
38 |
39 | #define SET__OPTION(opt, val, def) if (enforce) \
40 | lame_set_##opt(gfp, val); \
41 | else if (!(fabs(lame_get_##opt(gfp) - def) > 0)) \
42 | lame_set_##opt(gfp, val);
43 |
44 | #undef Min
45 | #undef Max
46 |
47 | static inline int
48 | min_int(int a, int b)
49 | {
50 | if (a < b) {
51 | return a;
52 | }
53 | return b;
54 | }
55 |
56 | static inline int
57 | max_int(int a, int b)
58 | {
59 | if (a > b) {
60 | return a;
61 | }
62 | return b;
63 | }
64 |
65 |
66 |
67 | typedef struct {
68 | int vbr_q;
69 | int quant_comp;
70 | int quant_comp_s;
71 | int expY;
72 | FLOAT st_lrm; /*short threshold */
73 | FLOAT st_s;
74 | FLOAT masking_adj;
75 | FLOAT masking_adj_short;
76 | FLOAT ath_lower;
77 | FLOAT ath_curve;
78 | FLOAT ath_sensitivity;
79 | FLOAT interch;
80 | int safejoint;
81 | int sfb21mod;
82 | FLOAT msfix;
83 | FLOAT minval;
84 | FLOAT ath_fixpoint;
85 | } vbr_presets_t;
86 |
87 | /* *INDENT-OFF* */
88 |
89 | /* Switch mappings for VBR mode VBR_RH */
90 | static const vbr_presets_t vbr_old_switch_map[] = {
91 | /*vbr_q qcomp_l qcomp_s expY st_lrm st_s mask adj_l adj_s ath_lower ath_curve ath_sens interChR safejoint sfb21mod msfix */
92 | {0, 9, 9, 0, 5.20, 125.0, -4.2, -6.3, 4.8, 1, 0, 0, 2, 21, 0.97, 5, 100},
93 | {1, 9, 9, 0, 5.30, 125.0, -3.6, -5.6, 4.5, 1.5, 0, 0, 2, 21, 1.35, 5, 100},
94 | {2, 9, 9, 0, 5.60, 125.0, -2.2, -3.5, 2.8, 2, 0, 0, 2, 21, 1.49, 5, 100},
95 | {3, 9, 9, 1, 5.80, 130.0, -1.8, -2.8, 2.6, 3, -4, 0, 2, 20, 1.64, 5, 100},
96 | {4, 9, 9, 1, 6.00, 135.0, -0.7, -1.1, 1.1, 3.5, -8, 0, 2, 0, 1.79, 5, 100},
97 | {5, 9, 9, 1, 6.40, 140.0, 0.5, 0.4, -7.5, 4, -12, 0.0002, 0, 0, 1.95, 5, 100},
98 | {6, 9, 9, 1, 6.60, 145.0, 0.67, 0.65, -14.7, 6.5, -19, 0.0004, 0, 0, 2.30, 5, 100},
99 | {7, 9, 9, 1, 6.60, 145.0, 0.8, 0.75, -19.7, 8, -22, 0.0006, 0, 0, 2.70, 5, 100},
100 | {8, 9, 9, 1, 6.60, 145.0, 1.2, 1.15, -27.5, 10, -23, 0.0007, 0, 0, 0, 5, 100},
101 | {9, 9, 9, 1, 6.60, 145.0, 1.6, 1.6, -36, 11, -25, 0.0008, 0, 0, 0, 5, 100},
102 | {10, 9, 9, 1, 6.60, 145.0, 2.0, 2.0, -36, 12, -25, 0.0008, 0, 0, 0, 5, 100}
103 | };
104 |
105 | static const vbr_presets_t vbr_mt_psy_switch_map[] = {
106 | /*vbr_q qcomp_l qcomp_s expY st_lrm st_s mask adj_l adj_s ath_lower ath_curve ath_sens --- safejoint sfb21mod msfix */
107 | {0, 9, 9, 0, 4.20, 25.0, -6.8, -6.8, 7.1, 1, 0, 0, 2, 31, 1.000, 5, 100},
108 | {1, 9, 9, 0, 4.20, 25.0, -4.8, -4.8, 5.4, 1.4, -1, 0, 2, 27, 1.122, 5, 98},
109 | {2, 9, 9, 0, 4.20, 25.0, -2.6, -2.6, 3.7, 2.0, -3, 0, 2, 23, 1.288, 5, 97},
110 | {3, 9, 9, 1, 4.20, 25.0, -1.6, -1.6, 2.0, 2.0, -5, 0, 2, 18, 1.479, 5, 96},
111 | {4, 9, 9, 1, 4.20, 25.0, -0.0, -0.0, 0.0, 2.0, -8, 0, 2, 12, 1.698, 5, 95},
112 | {5, 9, 9, 1, 4.20, 25.0, 1.3, 1.3, -6, 3.5, -11, 0, 2, 8, 1.950, 5, 94.2},
113 | #if 0
114 | {6, 9, 9, 1, 4.50, 100.0, 1.5, 1.5, -24.0, 6.0, -14, 0, 2, 4, 2.239, 3, 93.9},
115 | {7, 9, 9, 1, 4.80, 200.0, 1.7, 1.7, -28.0, 9.0, -20, 0, 2, 0, 2.570, 1, 93.6},
116 | #else
117 | {6, 9, 9, 1, 4.50, 100.0, 2.2, 2.3, -12.0, 6.0, -14, 0, 2, 4, 2.239, 3, 93.9},
118 | {7, 9, 9, 1, 4.80, 200.0, 2.7, 2.7, -18.0, 9.0, -17, 0, 2, 0, 2.570, 1, 93.6},
119 | #endif
120 | {8, 9, 9, 1, 5.30, 300.0, 2.8, 2.8, -21.0, 10.0, -23, 0.0002, 0, 0, 2.951, 0, 93.3},
121 | {9, 9, 9, 1, 6.60, 300.0, 2.8, 2.8, -23.0, 11.0, -25, 0.0006, 0, 0, 3.388, 0, 93.3},
122 | {10, 9, 9, 1, 25.00, 300.0, 2.8, 2.8, -25.0, 12.0, -27, 0.0025, 0, 0, 3.500, 0, 93.3}
123 | };
124 |
125 | /* *INDENT-ON* */
126 |
127 | static vbr_presets_t const*
128 | get_vbr_preset(int v)
129 | {
130 | switch (v) {
131 | case vbr_mtrh:
132 | case vbr_mt:
133 | return &vbr_mt_psy_switch_map[0];
134 | default:
135 | return &vbr_old_switch_map[0];
136 | }
137 | }
138 |
139 | #define NOOP(m) (void)p.m
140 | #define LERP(m) (p.m = p.m + x * (q.m - p.m))
141 |
142 | static void
143 | apply_vbr_preset(lame_global_flags * gfp, int a, int enforce)
144 | {
145 | vbr_presets_t const *vbr_preset = get_vbr_preset(lame_get_VBR(gfp));
146 | float x = gfp->VBR_q_frac;
147 | vbr_presets_t p = vbr_preset[a];
148 | vbr_presets_t q = vbr_preset[a + 1];
149 | vbr_presets_t const *set = &p;
150 |
151 | NOOP(vbr_q);
152 | NOOP(quant_comp);
153 | NOOP(quant_comp_s);
154 | NOOP(expY);
155 | LERP(st_lrm);
156 | LERP(st_s);
157 | LERP(masking_adj);
158 | LERP(masking_adj_short);
159 | LERP(ath_lower);
160 | LERP(ath_curve);
161 | LERP(ath_sensitivity);
162 | LERP(interch);
163 | NOOP(safejoint);
164 | LERP(sfb21mod);
165 | LERP(msfix);
166 | LERP(minval);
167 | LERP(ath_fixpoint);
168 |
169 | (void) lame_set_VBR_q(gfp, set->vbr_q);
170 | SET_OPTION(quant_comp, set->quant_comp, -1);
171 | SET_OPTION(quant_comp_short, set->quant_comp_s, -1);
172 | if (set->expY) {
173 | (void) lame_set_experimentalY(gfp, set->expY);
174 | }
175 | SET_OPTION(short_threshold_lrm, set->st_lrm, -1);
176 | SET_OPTION(short_threshold_s, set->st_s, -1);
177 | SET_OPTION(maskingadjust, set->masking_adj, 0);
178 | SET_OPTION(maskingadjust_short, set->masking_adj_short, 0);
179 | if (lame_get_VBR(gfp) == vbr_mt || lame_get_VBR(gfp) == vbr_mtrh) {
180 | lame_set_ATHtype(gfp, 5);
181 | }
182 | SET_OPTION(ATHlower, set->ath_lower, 0);
183 | SET_OPTION(ATHcurve, set->ath_curve, -1);
184 | SET_OPTION(athaa_sensitivity, set->ath_sensitivity, 0);
185 | if (set->interch > 0) {
186 | SET_OPTION(interChRatio, set->interch, -1);
187 | }
188 |
189 | /* parameters for which there is no proper set/get interface */
190 | if (set->safejoint > 0) {
191 | (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2);
192 | }
193 | if (set->sfb21mod > 0) {
194 | int const nsp = lame_get_exp_nspsytune(gfp);
195 | int const val = (nsp >> 20) & 63;
196 | if (val == 0) {
197 | int const sf21mod = (set->sfb21mod << 20) | nsp;
198 | (void) lame_set_exp_nspsytune(gfp, sf21mod);
199 | }
200 | }
201 | SET__OPTION(msfix, set->msfix, -1);
202 |
203 | if (enforce == 0) {
204 | gfp->VBR_q = a;
205 | gfp->VBR_q_frac = x;
206 | }
207 | gfp->internal_flags->cfg.minval = set->minval;
208 | gfp->internal_flags->cfg.ATHfixpoint = set->ath_fixpoint;
209 | }
210 |
211 | static int
212 | apply_abr_preset(lame_global_flags * gfp, int preset, int enforce)
213 | {
214 | typedef struct {
215 | int abr_kbps;
216 | int quant_comp;
217 | int quant_comp_s;
218 | int safejoint;
219 | FLOAT nsmsfix;
220 | FLOAT st_lrm; /*short threshold */
221 | FLOAT st_s;
222 | FLOAT scale;
223 | FLOAT masking_adj;
224 | FLOAT ath_lower;
225 | FLOAT ath_curve;
226 | FLOAT interch;
227 | int sfscale;
228 | } abr_presets_t;
229 |
230 |
231 | /* *INDENT-OFF* */
232 |
233 | /*
234 | * Switch mappings for ABR mode
235 | */
236 | const abr_presets_t abr_switch_map[] = {
237 | /* kbps quant q_s safejoint nsmsfix st_lrm st_s scale msk ath_lwr ath_curve interch , sfscale */
238 | { 8, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -30.0, 11, 0.0012, 1}, /* 8, impossible to use in stereo */
239 | { 16, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -25.0, 11, 0.0010, 1}, /* 16 */
240 | { 24, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -20.0, 11, 0.0010, 1}, /* 24 */
241 | { 32, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -15.0, 11, 0.0010, 1}, /* 32 */
242 | { 40, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -10.0, 11, 0.0009, 1}, /* 40 */
243 | { 48, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -10.0, 11, 0.0009, 1}, /* 48 */
244 | { 56, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -6.0, 11, 0.0008, 1}, /* 56 */
245 | { 64, 9, 9, 0, 0, 6.60, 145, 0.95, 0, -2.0, 11, 0.0008, 1}, /* 64 */
246 | { 80, 9, 9, 0, 0, 6.60, 145, 0.95, 0, .0, 8, 0.0007, 1}, /* 80 */
247 | { 96, 9, 9, 0, 2.50, 6.60, 145, 0.95, 0, 1.0, 5.5, 0.0006, 1}, /* 96 */
248 | {112, 9, 9, 0, 2.25, 6.60, 145, 0.95, 0, 2.0, 4.5, 0.0005, 1}, /* 112 */
249 | {128, 9, 9, 0, 1.95, 6.40, 140, 0.95, 0, 3.0, 4, 0.0002, 1}, /* 128 */
250 | {160, 9, 9, 1, 1.79, 6.00, 135, 0.95, -2, 5.0, 3.5, 0, 1}, /* 160 */
251 | {192, 9, 9, 1, 1.49, 5.60, 125, 0.97, -4, 7.0, 3, 0, 0}, /* 192 */
252 | {224, 9, 9, 1, 1.25, 5.20, 125, 0.98, -6, 9.0, 2, 0, 0}, /* 224 */
253 | {256, 9, 9, 1, 0.97, 5.20, 125, 1.00, -8, 10.0, 1, 0, 0}, /* 256 */
254 | {320, 9, 9, 1, 0.90, 5.20, 125, 1.00, -10, 12.0, 0, 0, 0} /* 320 */
255 | };
256 |
257 | /* *INDENT-ON* */
258 |
259 | /* Variables for the ABR stuff */
260 | int r;
261 | int actual_bitrate = preset;
262 |
263 | r = nearestBitrateFullIndex(preset);
264 |
265 | (void) lame_set_VBR(gfp, vbr_abr);
266 | (void) lame_set_VBR_mean_bitrate_kbps(gfp, (actual_bitrate));
267 | (void) lame_set_VBR_mean_bitrate_kbps(gfp, min_int(lame_get_VBR_mean_bitrate_kbps(gfp), 320));
268 | (void) lame_set_VBR_mean_bitrate_kbps(gfp, max_int(lame_get_VBR_mean_bitrate_kbps(gfp), 8));
269 | (void) lame_set_brate(gfp, lame_get_VBR_mean_bitrate_kbps(gfp));
270 |
271 |
272 | /* parameters for which there is no proper set/get interface */
273 | if (abr_switch_map[r].safejoint > 0)
274 | (void) lame_set_exp_nspsytune(gfp, lame_get_exp_nspsytune(gfp) | 2); /* safejoint */
275 |
276 | if (abr_switch_map[r].sfscale > 0)
277 | (void) lame_set_sfscale(gfp, 1);
278 |
279 |
280 | SET_OPTION(quant_comp, abr_switch_map[r].quant_comp, -1);
281 | SET_OPTION(quant_comp_short, abr_switch_map[r].quant_comp_s, -1);
282 |
283 | SET__OPTION(msfix, abr_switch_map[r].nsmsfix, -1);
284 |
285 | SET_OPTION(short_threshold_lrm, abr_switch_map[r].st_lrm, -1);
286 | SET_OPTION(short_threshold_s, abr_switch_map[r].st_s, -1);
287 |
288 | /* ABR seems to have big problems with clipping, especially at low bitrates */
289 | /* so we compensate for that here by using a scale value depending on bitrate */
290 | lame_set_scale(gfp, lame_get_scale(gfp) * abr_switch_map[r].scale);
291 |
292 | SET_OPTION(maskingadjust, abr_switch_map[r].masking_adj, 0);
293 | if (abr_switch_map[r].masking_adj > 0) {
294 | SET_OPTION(maskingadjust_short, abr_switch_map[r].masking_adj * .9, 0);
295 | }
296 | else {
297 | SET_OPTION(maskingadjust_short, abr_switch_map[r].masking_adj * 1.1, 0);
298 | }
299 |
300 |
301 | SET_OPTION(ATHlower, abr_switch_map[r].ath_lower, 0);
302 | SET_OPTION(ATHcurve, abr_switch_map[r].ath_curve, -1);
303 |
304 | SET_OPTION(interChRatio, abr_switch_map[r].interch, -1);
305 |
306 | (void) abr_switch_map[r].abr_kbps;
307 |
308 | gfp->internal_flags->cfg.minval = 5. * (abr_switch_map[r].abr_kbps / 320.);
309 |
310 | return preset;
311 | }
312 |
313 |
314 |
315 | int
316 | apply_preset(lame_global_flags * gfp, int preset, int enforce)
317 | {
318 | /*translate legacy presets */
319 | switch (preset) {
320 | case R3MIX:
321 | {
322 | preset = V3;
323 | (void) lame_set_VBR(gfp, vbr_mtrh);
324 | break;
325 | }
326 | case MEDIUM:
327 | case MEDIUM_FAST:
328 | {
329 | preset = V4;
330 | (void) lame_set_VBR(gfp, vbr_mtrh);
331 | break;
332 | }
333 | case STANDARD:
334 | case STANDARD_FAST:
335 | {
336 | preset = V2;
337 | (void) lame_set_VBR(gfp, vbr_mtrh);
338 | break;
339 | }
340 | case EXTREME:
341 | case EXTREME_FAST:
342 | {
343 | preset = V0;
344 | (void) lame_set_VBR(gfp, vbr_mtrh);
345 | break;
346 | }
347 | case INSANE:
348 | {
349 | preset = 320;
350 | gfp->preset = preset;
351 | (void) apply_abr_preset(gfp, preset, enforce);
352 | lame_set_VBR(gfp, vbr_off);
353 | return preset;
354 | }
355 | }
356 |
357 | gfp->preset = preset;
358 | {
359 | switch (preset) {
360 | case V9:
361 | apply_vbr_preset(gfp, 9, enforce);
362 | return preset;
363 | case V8:
364 | apply_vbr_preset(gfp, 8, enforce);
365 | return preset;
366 | case V7:
367 | apply_vbr_preset(gfp, 7, enforce);
368 | return preset;
369 | case V6:
370 | apply_vbr_preset(gfp, 6, enforce);
371 | return preset;
372 | case V5:
373 | apply_vbr_preset(gfp, 5, enforce);
374 | return preset;
375 | case V4:
376 | apply_vbr_preset(gfp, 4, enforce);
377 | return preset;
378 | case V3:
379 | apply_vbr_preset(gfp, 3, enforce);
380 | return preset;
381 | case V2:
382 | apply_vbr_preset(gfp, 2, enforce);
383 | return preset;
384 | case V1:
385 | apply_vbr_preset(gfp, 1, enforce);
386 | return preset;
387 | case V0:
388 | apply_vbr_preset(gfp, 0, enforce);
389 | return preset;
390 | default:
391 | break;
392 | }
393 | }
394 | if (8 <= preset && preset <= 320) {
395 | return apply_abr_preset(gfp, preset, enforce);
396 | }
397 |
398 | gfp->preset = 0; /*no corresponding preset found */
399 | return preset;
400 | }
401 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/psymodel.h:
--------------------------------------------------------------------------------
1 | /*
2 | * psymodel.h
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_PSYMODEL_H
23 | #define LAME_PSYMODEL_H
24 |
25 |
26 | int L3psycho_anal_ns(lame_internal_flags * gfc,
27 | const sample_t *const buffer[2], int gr,
28 | III_psy_ratio ratio[2][2],
29 | III_psy_ratio MS_ratio[2][2],
30 | FLOAT pe[2], FLOAT pe_MS[2], FLOAT ener[2], int blocktype_d[2]);
31 |
32 | int L3psycho_anal_vbr(lame_internal_flags * gfc,
33 | const sample_t *const buffer[2], int gr,
34 | III_psy_ratio ratio[2][2],
35 | III_psy_ratio MS_ratio[2][2],
36 | FLOAT pe[2], FLOAT pe_MS[2], FLOAT ener[2], int blocktype_d[2]);
37 |
38 |
39 | int psymodel_init(lame_global_flags const* gfp);
40 |
41 |
42 | #define rpelev 2
43 | #define rpelev2 16
44 | #define rpelev_s 2
45 | #define rpelev2_s 16
46 |
47 | /* size of each partition band, in barks: */
48 | #define DELBARK .34
49 |
50 |
51 | /* tuned for output level (sensitive to energy scale) */
52 | #define VO_SCALE (1./( 14752*14752 )/(BLKSIZE/2))
53 |
54 | #define temporalmask_sustain_sec 0.01
55 |
56 | #define NS_PREECHO_ATT0 0.8
57 | #define NS_PREECHO_ATT1 0.6
58 | #define NS_PREECHO_ATT2 0.3
59 |
60 | #define NS_MSFIX 3.5
61 | #define NSATTACKTHRE 4.4
62 | #define NSATTACKTHRE_S 25
63 |
64 | #endif /* LAME_PSYMODEL_H */
65 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/quantize.h:
--------------------------------------------------------------------------------
1 | /*
2 | * MP3 quantization
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_QUANTIZE_H
23 | #define LAME_QUANTIZE_H
24 |
25 | void CBR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2],
26 | const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]);
27 |
28 | void VBR_old_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2],
29 | const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]);
30 |
31 | void VBR_new_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2],
32 | const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]);
33 |
34 | void ABR_iteration_loop(lame_internal_flags * gfc, const FLOAT pe[2][2],
35 | const FLOAT ms_ratio[2], const III_psy_ratio ratio[2][2]);
36 |
37 |
38 | #endif /* LAME_QUANTIZE_H */
39 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/quantize_pvt.h:
--------------------------------------------------------------------------------
1 | /*
2 | * quantize_pvt include file
3 | *
4 | * Copyright (c) 1999 Takehiro TOMINAGA
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_QUANTIZE_PVT_H
23 | #define LAME_QUANTIZE_PVT_H
24 |
25 | #define IXMAX_VAL 8206 /* ix always <= 8191+15. see count_bits() */
26 |
27 | /* buggy Winamp decoder cannot handle values > 8191 */
28 | /* #define IXMAX_VAL 8191 */
29 |
30 | #define PRECALC_SIZE (IXMAX_VAL+2)
31 |
32 |
33 | extern const int nr_of_sfb_block[6][3][4];
34 | extern const int pretab[SBMAX_l];
35 | extern const int slen1_tab[16];
36 | extern const int slen2_tab[16];
37 |
38 | extern const scalefac_struct sfBandIndex[9];
39 |
40 | extern FLOAT pow43[PRECALC_SIZE];
41 | #ifdef TAKEHIRO_IEEE754_HACK
42 | extern FLOAT adj43asm[PRECALC_SIZE];
43 | #else
44 | extern FLOAT adj43[PRECALC_SIZE];
45 | #endif
46 |
47 | #define Q_MAX (256+1)
48 | #define Q_MAX2 116 /* minimum possible number of
49 | -cod_info->global_gain
50 | + ((scalefac[] + (cod_info->preflag ? pretab[sfb] : 0))
51 | << (cod_info->scalefac_scale + 1))
52 | + cod_info->subblock_gain[cod_info->window[sfb]] * 8;
53 |
54 | for long block, 0+((15+3)<<2) = 18*4 = 72
55 | for short block, 0+(15<<2)+7*8 = 15*4+56 = 116
56 | */
57 |
58 | extern FLOAT pow20[Q_MAX + Q_MAX2 + 1];
59 | extern FLOAT ipow20[Q_MAX];
60 |
61 | typedef struct calc_noise_result_t {
62 | FLOAT over_noise; /* sum of quantization noise > masking */
63 | FLOAT tot_noise; /* sum of all quantization noise */
64 | FLOAT max_noise; /* max quantization noise */
65 | int over_count; /* number of quantization noise > masking */
66 | int over_SSD; /* SSD-like cost of distorted bands */
67 | int bits;
68 | } calc_noise_result;
69 |
70 |
71 | /**
72 | * allows re-use of previously
73 | * computed noise values
74 | */
75 | typedef struct calc_noise_data_t {
76 | int global_gain;
77 | int sfb_count1;
78 | int step[39];
79 | FLOAT noise[39];
80 | FLOAT noise_log[39];
81 | } calc_noise_data;
82 |
83 |
84 | int on_pe(lame_internal_flags * gfc, const FLOAT pe[2][2],
85 | int targ_bits[2], int mean_bits, int gr, int cbr);
86 |
87 | void reduce_side(int targ_bits[2], FLOAT ms_ener_ratio, int mean_bits, int max_bits);
88 |
89 |
90 | void iteration_init(lame_internal_flags * gfc);
91 |
92 |
93 | int calc_xmin(lame_internal_flags const *gfc,
94 | III_psy_ratio const *const ratio, gr_info * const cod_info, FLOAT * l3_xmin);
95 |
96 | int calc_noise(const gr_info * const cod_info,
97 | const FLOAT * l3_xmin,
98 | FLOAT * distort, calc_noise_result * const res, calc_noise_data * prev_noise);
99 |
100 | void set_frame_pinfo(lame_internal_flags * gfc, const III_psy_ratio ratio[2][2]);
101 |
102 |
103 |
104 |
105 | /* takehiro.c */
106 |
107 | int count_bits(lame_internal_flags const *const gfc, const FLOAT * const xr,
108 | gr_info * const cod_info, calc_noise_data * prev_noise);
109 | int noquant_count_bits(lame_internal_flags const *const gfc,
110 | gr_info * const cod_info, calc_noise_data * prev_noise);
111 |
112 |
113 | void best_huffman_divide(const lame_internal_flags * const gfc, gr_info * const cod_info);
114 |
115 | void best_scalefac_store(const lame_internal_flags * gfc, const int gr, const int ch,
116 | III_side_info_t * const l3_side);
117 |
118 | int scale_bitcount(const lame_internal_flags * gfc, gr_info * cod_info);
119 |
120 | void huffman_init(lame_internal_flags * const gfc);
121 |
122 | void init_xrpow_core_init(lame_internal_flags * const gfc);
123 |
124 | FLOAT athAdjust(FLOAT a, FLOAT x, FLOAT athFloor, float ATHfixpoint);
125 |
126 | #define LARGE_BITS 100000
127 |
128 | #endif /* LAME_QUANTIZE_PVT_H */
129 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/reservoir.c:
--------------------------------------------------------------------------------
1 | /*
2 | * bit reservoir source file
3 | *
4 | * Copyright (c) 1999-2000 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | /* $Id: reservoir.c,v 1.45 2011/05/07 16:05:17 rbrito Exp $ */
23 |
24 | #ifdef HAVE_CONFIG_H
25 | # include
26 | #endif
27 |
28 |
29 | #include "lame.h"
30 | #include "machine.h"
31 | #include "encoder.h"
32 | #include "util.h"
33 | #include "reservoir.h"
34 |
35 | #include "bitstream.h"
36 | #include "lame-analysis.h"
37 | #include "lame_global_flags.h"
38 |
39 |
40 | /*
41 | ResvFrameBegin:
42 | Called (repeatedly) at the beginning of a frame. Updates the maximum
43 | size of the reservoir, and checks to make sure main_data_begin
44 | was set properly by the formatter
45 | */
46 |
47 | /*
48 | * Background information:
49 | *
50 | * This is the original text from the ISO standard. Because of
51 | * sooo many bugs and irritations correcting comments are added
52 | * in brackets []. A '^W' means you should remove the last word.
53 | *
54 | * 1) The following rule can be used to calculate the maximum
55 | * number of bits used for one granule [^W frame]:
56 | * At the highest possible bitrate of Layer III (320 kbps
57 | * per stereo signal [^W^W^W], 48 kHz) the frames must be of
58 | * [^W^W^W are designed to have] constant length, i.e.
59 | * one buffer [^W^W the frame] length is:
60 | *
61 | * 320 kbps * 1152/48 kHz = 7680 bit = 960 byte
62 | *
63 | * This value is used as the maximum buffer per channel [^W^W] at
64 | * lower bitrates [than 320 kbps]. At 64 kbps mono or 128 kbps
65 | * stereo the main granule length is 64 kbps * 576/48 kHz = 768 bit
66 | * [per granule and channel] at 48 kHz sampling frequency.
67 | * This means that there is a maximum deviation (short time buffer
68 | * [= reservoir]) of 7680 - 2*2*768 = 4608 bits is allowed at 64 kbps.
69 | * The actual deviation is equal to the number of bytes [with the
70 | * meaning of octets] denoted by the main_data_end offset pointer.
71 | * The actual maximum deviation is (2^9-1)*8 bit = 4088 bits
72 | * [for MPEG-1 and (2^8-1)*8 bit for MPEG-2, both are hard limits].
73 | * ... The xchange of buffer bits between the left and right channel
74 | * is allowed without restrictions [exception: dual channel].
75 | * Because of the [constructed] constraint on the buffer size
76 | * main_data_end is always set to 0 in the case of bit_rate_index==14,
77 | * i.e. data rate 320 kbps per stereo signal [^W^W^W]. In this case
78 | * all data are allocated between adjacent header [^W sync] words
79 | * [, i.e. there is no buffering at all].
80 | */
81 |
82 | int
83 | ResvFrameBegin(lame_internal_flags * gfc, int *mean_bits)
84 | {
85 | SessionConfig_t const *const cfg = &gfc->cfg;
86 | EncStateVar_t *const esv = &gfc->sv_enc;
87 | int fullFrameBits;
88 | int resvLimit;
89 | int maxmp3buf;
90 | III_side_info_t *const l3_side = &gfc->l3_side;
91 | int frameLength;
92 | int meanBits;
93 |
94 | frameLength = getframebits(gfc);
95 | meanBits = (frameLength - cfg->sideinfo_len * 8) / cfg->mode_gr;
96 |
97 | /*
98 | * Meaning of the variables:
99 | * resvLimit: (0, 8, ..., 8*255 (MPEG-2), 8*511 (MPEG-1))
100 | * Number of bits can be stored in previous frame(s) due to
101 | * counter size constaints
102 | * maxmp3buf: ( ??? ... 8*1951 (MPEG-1 and 2), 8*2047 (MPEG-2.5))
103 | * Number of bits allowed to encode one frame (you can take 8*511 bit
104 | * from the bit reservoir and at most 8*1440 bit from the current
105 | * frame (320 kbps, 32 kHz), so 8*1951 bit is the largest possible
106 | * value for MPEG-1 and -2)
107 | *
108 | * maximum allowed granule/channel size times 4 = 8*2047 bits.,
109 | * so this is the absolute maximum supported by the format.
110 | *
111 | *
112 | * fullFrameBits: maximum number of bits available for encoding
113 | * the current frame.
114 | *
115 | * mean_bits: target number of bits per granule.
116 | *
117 | * frameLength:
118 | *
119 | * gfc->ResvMax: maximum allowed reservoir
120 | *
121 | * gfc->ResvSize: current reservoir size
122 | *
123 | * l3_side->resvDrain_pre:
124 | * ancillary data to be added to previous frame:
125 | * (only usefull in VBR modes if it is possible to have
126 | * maxmp3buf < fullFrameBits)). Currently disabled,
127 | * see #define NEW_DRAIN
128 | * 2010-02-13: RH now enabled, it seems to be needed for CBR too,
129 | * as there exists one example, where the FhG decoder
130 | * can't decode a -b320 CBR file anymore.
131 | *
132 | * l3_side->resvDrain_post:
133 | * ancillary data to be added to this frame:
134 | *
135 | */
136 |
137 | /* main_data_begin has 9 bits in MPEG-1, 8 bits MPEG-2 */
138 | resvLimit = (8 * 256) * cfg->mode_gr - 8;
139 |
140 | /* maximum allowed frame size. dont use more than this number of
141 | bits, even if the frame has the space for them: */
142 | maxmp3buf = cfg->buffer_constraint;
143 | esv->ResvMax = maxmp3buf - frameLength;
144 | if (esv->ResvMax > resvLimit)
145 | esv->ResvMax = resvLimit;
146 | if (esv->ResvMax < 0 || cfg->disable_reservoir)
147 | esv->ResvMax = 0;
148 |
149 | fullFrameBits = meanBits * cfg->mode_gr + Min(esv->ResvSize, esv->ResvMax);
150 |
151 | if (fullFrameBits > maxmp3buf)
152 | fullFrameBits = maxmp3buf;
153 |
154 | assert(0 == esv->ResvMax % 8);
155 | assert(esv->ResvMax >= 0);
156 |
157 | l3_side->resvDrain_pre = 0;
158 |
159 | if (gfc->pinfo != NULL) {
160 | gfc->pinfo->mean_bits = meanBits / 2; /* expected bits per channel per granule [is this also right for mono/stereo, MPEG-1/2 ?] */
161 | gfc->pinfo->resvsize = esv->ResvSize;
162 | }
163 | *mean_bits = meanBits;
164 | return fullFrameBits;
165 | }
166 |
167 |
168 | /*
169 | ResvMaxBits
170 | returns targ_bits: target number of bits to use for 1 granule
171 | extra_bits: amount extra available from reservoir
172 | Mark Taylor 4/99
173 | */
174 | void
175 | ResvMaxBits(lame_internal_flags * gfc, int mean_bits, int *targ_bits, int *extra_bits, int cbr)
176 | {
177 | SessionConfig_t const *const cfg = &gfc->cfg;
178 | EncStateVar_t *const esv = &gfc->sv_enc;
179 | int add_bits, targBits, extraBits;
180 | int ResvSize = esv->ResvSize, ResvMax = esv->ResvMax;
181 |
182 | /* conpensate the saved bits used in the 1st granule */
183 | if (cbr)
184 | ResvSize += mean_bits;
185 |
186 | if (gfc->sv_qnt.substep_shaping & 1)
187 | ResvMax *= 0.9;
188 |
189 | targBits = mean_bits;
190 |
191 | /* extra bits if the reservoir is almost full */
192 | if (ResvSize * 10 > ResvMax * 9) {
193 | add_bits = ResvSize - (ResvMax * 9) / 10;
194 | targBits += add_bits;
195 | gfc->sv_qnt.substep_shaping |= 0x80;
196 | }
197 | else {
198 | add_bits = 0;
199 | gfc->sv_qnt.substep_shaping &= 0x7f;
200 | /* build up reservoir. this builds the reservoir a little slower
201 | * than FhG. It could simple be mean_bits/15, but this was rigged
202 | * to always produce 100 (the old value) at 128kbs */
203 | /* *targ_bits -= (int) (mean_bits/15.2); */
204 | if (!cfg->disable_reservoir && !(gfc->sv_qnt.substep_shaping & 1))
205 | targBits -= .1 * mean_bits;
206 | }
207 |
208 |
209 | /* amount from the reservoir we are allowed to use. ISO says 6/10 */
210 | extraBits = (ResvSize < (esv->ResvMax * 6) / 10 ? ResvSize : (esv->ResvMax * 6) / 10);
211 | extraBits -= add_bits;
212 |
213 | if (extraBits < 0)
214 | extraBits = 0;
215 |
216 | *targ_bits = targBits;
217 | *extra_bits = extraBits;
218 | }
219 |
220 | /*
221 | ResvAdjust:
222 | Called after a granule's bit allocation. Readjusts the size of
223 | the reservoir to reflect the granule's usage.
224 | */
225 | void
226 | ResvAdjust(lame_internal_flags * gfc, gr_info const *gi)
227 | {
228 | gfc->sv_enc.ResvSize -= gi->part2_3_length + gi->part2_length;
229 | }
230 |
231 |
232 | /*
233 | ResvFrameEnd:
234 | Called after all granules in a frame have been allocated. Makes sure
235 | that the reservoir size is within limits, possibly by adding stuffing
236 | bits.
237 | */
238 | void
239 | ResvFrameEnd(lame_internal_flags * gfc, int mean_bits)
240 | {
241 | SessionConfig_t const *const cfg = &gfc->cfg;
242 | EncStateVar_t *const esv = &gfc->sv_enc;
243 | III_side_info_t *const l3_side = &gfc->l3_side;
244 | int stuffingBits;
245 | int over_bits;
246 |
247 | esv->ResvSize += mean_bits * cfg->mode_gr;
248 | stuffingBits = 0;
249 | l3_side->resvDrain_post = 0;
250 | l3_side->resvDrain_pre = 0;
251 |
252 | /* we must be byte aligned */
253 | if ((over_bits = esv->ResvSize % 8) != 0)
254 | stuffingBits += over_bits;
255 |
256 |
257 | over_bits = (esv->ResvSize - stuffingBits) - esv->ResvMax;
258 | if (over_bits > 0) {
259 | assert(0 == over_bits % 8);
260 | assert(over_bits >= 0);
261 | stuffingBits += over_bits;
262 | }
263 |
264 |
265 | /* NOTE: enabling the NEW_DRAIN code fixes some problems with FhG decoder
266 | shipped with MS Windows operating systems. Using this, it is even
267 | possible to use Gabriel's lax buffer consideration again, which
268 | assumes, any decoder should have a buffer large enough
269 | for a 320 kbps frame at 32 kHz sample rate.
270 |
271 | old drain code:
272 | lame -b320 BlackBird.wav ---> does not play with GraphEdit.exe using FhG decoder V1.5 Build 50
273 |
274 | new drain code:
275 | lame -b320 BlackBird.wav ---> plays fine with GraphEdit.exe using FhG decoder V1.5 Build 50
276 |
277 | Robert Hegemann, 2010-02-13.
278 | */
279 | /* drain as many bits as possible into previous frame ancillary data
280 | * In particular, in VBR mode ResvMax may have changed, and we have
281 | * to make sure main_data_begin does not create a reservoir bigger
282 | * than ResvMax mt 4/00*/
283 | {
284 | int mdb_bytes = Min(l3_side->main_data_begin * 8, stuffingBits) / 8;
285 | l3_side->resvDrain_pre += 8 * mdb_bytes;
286 | stuffingBits -= 8 * mdb_bytes;
287 | esv->ResvSize -= 8 * mdb_bytes;
288 | l3_side->main_data_begin -= mdb_bytes;
289 | }
290 | /* drain the rest into this frames ancillary data */
291 | l3_side->resvDrain_post += stuffingBits;
292 | esv->ResvSize -= stuffingBits;
293 | }
294 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/reservoir.h:
--------------------------------------------------------------------------------
1 | /*
2 | * bit reservoir include file
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_RESERVOIR_H
23 | #define LAME_RESERVOIR_H
24 |
25 | int ResvFrameBegin(lame_internal_flags * gfc, int *mean_bits);
26 | void ResvMaxBits(lame_internal_flags * gfc, int mean_bits, int *targ_bits, int *max_bits,
27 | int cbr);
28 | void ResvAdjust(lame_internal_flags * gfc, gr_info const *gi);
29 | void ResvFrameEnd(lame_internal_flags * gfc, int mean_bits);
30 |
31 | #endif /* LAME_RESERVOIR_H */
32 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/set_get.h:
--------------------------------------------------------------------------------
1 | /*
2 | * set_get.h -- Internal set/get definitions
3 | *
4 | * Copyright (C) 2003 Gabriel Bouvigne / Lame project
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the Free Software
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
19 | */
20 |
21 | #ifndef __SET_GET_H__
22 | #define __SET_GET_H__
23 |
24 | #include "lame.h"
25 |
26 | #if defined(__cplusplus)
27 | extern "C" {
28 | #endif
29 |
30 | /* select psychoacoustic model */
31 |
32 | /* manage short blocks */
33 | int CDECL lame_set_short_threshold(lame_global_flags *, float, float);
34 | int CDECL lame_set_short_threshold_lrm(lame_global_flags *, float);
35 | float CDECL lame_get_short_threshold_lrm(const lame_global_flags *);
36 | int CDECL lame_set_short_threshold_s(lame_global_flags *, float);
37 | float CDECL lame_get_short_threshold_s(const lame_global_flags *);
38 |
39 |
40 | int CDECL lame_set_maskingadjust(lame_global_flags *, float);
41 | float CDECL lame_get_maskingadjust(const lame_global_flags *);
42 |
43 | int CDECL lame_set_maskingadjust_short(lame_global_flags *, float);
44 | float CDECL lame_get_maskingadjust_short(const lame_global_flags *);
45 |
46 | /* select ATH formula 4 shape */
47 | int CDECL lame_set_ATHcurve(lame_global_flags *, float);
48 | float CDECL lame_get_ATHcurve(const lame_global_flags *);
49 |
50 | int CDECL lame_set_preset_notune(lame_global_flags *, int);
51 |
52 | /* substep shaping method */
53 | int CDECL lame_set_substep(lame_global_flags *, int);
54 | int CDECL lame_get_substep(const lame_global_flags *);
55 |
56 | /* scalefactors scale */
57 | int CDECL lame_set_sfscale(lame_global_flags *, int);
58 | int CDECL lame_get_sfscale(const lame_global_flags *);
59 |
60 | /* subblock gain */
61 | int CDECL lame_set_subblock_gain(lame_global_flags *, int);
62 | int CDECL lame_get_subblock_gain(const lame_global_flags *);
63 |
64 |
65 |
66 | /*presets*/
67 | int apply_preset(lame_global_flags *, int preset, int enforce);
68 |
69 | void CDECL lame_set_tune(lame_t, float); /* FOR INTERNAL USE ONLY */
70 | void CDECL lame_set_msfix(lame_t gfp, double msfix);
71 |
72 |
73 | #if defined(__cplusplus)
74 | }
75 | #endif
76 | #endif
77 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/tables.h:
--------------------------------------------------------------------------------
1 | /*
2 | * MPEG layer 3 tables include file
3 | *
4 | * Copyright (c) 1999 Albert L Faber
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_TABLES_H
23 | #define LAME_TABLES_H
24 |
25 | #if 0
26 | typedef struct {
27 | unsigned char no;
28 | unsigned char width;
29 | unsigned char minval_2;
30 | float quiet_thr;
31 | float norm;
32 | float bark;
33 | } type1_t;
34 |
35 | typedef struct {
36 | unsigned char no;
37 | unsigned char width;
38 | float quiet_thr;
39 | float norm;
40 | float SNR;
41 | float bark;
42 | } type2_t;
43 |
44 | typedef struct {
45 | unsigned int no:5;
46 | unsigned int cbw:3;
47 | unsigned int bu:6;
48 | unsigned int bo:6;
49 | unsigned int w1_576:10;
50 | unsigned int w2_576:10;
51 | } type34_t;
52 |
53 | typedef struct {
54 | size_t len1;
55 | const type1_t *const tab1;
56 | size_t len2;
57 | const type2_t *const tab2;
58 | size_t len3;
59 | const type34_t *const tab3;
60 | size_t len4;
61 | const type34_t *const tab4;
62 | } type5_t;
63 |
64 | extern const type5_t table5[6];
65 |
66 | #endif
67 |
68 | #define HTN 34
69 |
70 | struct huffcodetab {
71 | const unsigned int xlen; /* max. x-index+ */
72 | const unsigned int linmax; /* max number to be stored in linbits */
73 | const uint16_t *table; /* pointer to array[xlen][ylen] */
74 | const uint8_t *hlen; /* pointer to array[xlen][ylen] */
75 | };
76 |
77 | extern const struct huffcodetab ht[HTN];
78 | /* global memory block */
79 | /* array of all huffcodtable headers */
80 | /* 0..31 Huffman code table 0..31 */
81 | /* 32,33 count1-tables */
82 |
83 | extern const uint8_t t32l[];
84 | extern const uint8_t t33l[];
85 |
86 | extern const uint32_t largetbl[16 * 16];
87 | extern const uint32_t table23[3 * 3];
88 | extern const uint32_t table56[4 * 4];
89 |
90 | extern const int scfsi_band[5];
91 |
92 | extern const int bitrate_table [3][16];
93 | extern const int samplerate_table [3][ 4];
94 |
95 | #endif /* LAME_TABLES_H */
96 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/vbrquantize.h:
--------------------------------------------------------------------------------
1 | /*
2 | * MP3 VBR quantization
3 | *
4 | * Copyright (c) 1999 Mark Taylor
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_VBRQUANTIZE_H
23 | #define LAME_VBRQUANTIZE_H
24 |
25 | int VBR_encode_frame(lame_internal_flags * gfc, const FLOAT xr34orig[2][2][576],
26 | const FLOAT l3_xmin[2][2][SFBMAX], const int maxbits[2][2]);
27 |
28 | #endif /* LAME_VBRQUANTIZE_H */
29 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/vector/lame_intrin.h:
--------------------------------------------------------------------------------
1 | /*
2 | * lame_intrin.h include file
3 | *
4 | * Copyright (c) 2006 Gabriel Bouvigne
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 |
23 | #ifndef LAME_INTRIN_H
24 | #define LAME_INTRIN_H
25 |
26 |
27 | void
28 | init_xrpow_core_sse(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum);
29 |
30 | void
31 | fht_SSE2(FLOAT* , int);
32 |
33 | #endif
34 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/vector/xmm_quantize_sub.c:
--------------------------------------------------------------------------------
1 | /*
2 | * MP3 quantization, intrinsics functions
3 | *
4 | * Copyright (c) 2005-2006 Gabriel Bouvigne
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 |
23 | #ifdef HAVE_CONFIG_H
24 | # include
25 | #endif
26 |
27 | #include "lame.h"
28 | #include "machine.h"
29 | #include "encoder.h"
30 | #include "util.h"
31 | #include "lame_intrin.h"
32 |
33 |
34 |
35 | #ifdef HAVE_XMMINTRIN_H
36 |
37 | #include
38 |
39 | typedef union {
40 | int32_t _i_32[4]; /* unions are initialized by its first member */
41 | float _float[4];
42 | __m128 _m128;
43 | } vecfloat_union;
44 |
45 | #define TRI_SIZE (5-1) /* 1024 = 4**5 */
46 | static const FLOAT costab[TRI_SIZE * 2] = {
47 | 9.238795325112867e-01, 3.826834323650898e-01,
48 | 9.951847266721969e-01, 9.801714032956060e-02,
49 | 9.996988186962042e-01, 2.454122852291229e-02,
50 | 9.999811752826011e-01, 6.135884649154475e-03
51 | };
52 |
53 |
54 |
55 | void
56 | init_xrpow_core_sse(gr_info * const cod_info, FLOAT xrpow[576], int upper, FLOAT * sum)
57 | {
58 | int i;
59 | float tmp_max = 0;
60 | float tmp_sum = 0;
61 | int upper4 = (upper / 4) * 4;
62 | int rest = upper-upper4;
63 |
64 | const vecfloat_union fabs_mask = {{ 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF }};
65 | const __m128 vec_fabs_mask = _mm_loadu_ps(&fabs_mask._float[0]);
66 | vecfloat_union vec_xrpow_max;
67 | vecfloat_union vec_sum;
68 | vecfloat_union vec_tmp;
69 |
70 | _mm_prefetch((char *) cod_info->xr, _MM_HINT_T0);
71 | _mm_prefetch((char *) xrpow, _MM_HINT_T0);
72 |
73 | vec_xrpow_max._m128 = _mm_set_ps1(0);
74 | vec_sum._m128 = _mm_set_ps1(0);
75 |
76 | for (i = 0; i < upper4; i += 4) {
77 | vec_tmp._m128 = _mm_loadu_ps(&(cod_info->xr[i])); /* load */
78 | vec_tmp._m128 = _mm_and_ps(vec_tmp._m128, vec_fabs_mask); /* fabs */
79 | vec_sum._m128 = _mm_add_ps(vec_sum._m128, vec_tmp._m128);
80 | vec_tmp._m128 = _mm_sqrt_ps(_mm_mul_ps(vec_tmp._m128, _mm_sqrt_ps(vec_tmp._m128)));
81 | vec_xrpow_max._m128 = _mm_max_ps(vec_xrpow_max._m128, vec_tmp._m128); /* retrieve max */
82 | _mm_storeu_ps(&(xrpow[i]), vec_tmp._m128); /* store into xrpow[] */
83 | }
84 | vec_tmp._m128 = _mm_set_ps1(0);
85 | switch (rest) {
86 | case 3: vec_tmp._float[2] = cod_info->xr[upper4+2];
87 | case 2: vec_tmp._float[1] = cod_info->xr[upper4+1];
88 | case 1: vec_tmp._float[0] = cod_info->xr[upper4+0];
89 | vec_tmp._m128 = _mm_and_ps(vec_tmp._m128, vec_fabs_mask); /* fabs */
90 | vec_sum._m128 = _mm_add_ps(vec_sum._m128, vec_tmp._m128);
91 | vec_tmp._m128 = _mm_sqrt_ps(_mm_mul_ps(vec_tmp._m128, _mm_sqrt_ps(vec_tmp._m128)));
92 | vec_xrpow_max._m128 = _mm_max_ps(vec_xrpow_max._m128, vec_tmp._m128); /* retrieve max */
93 | switch (rest) {
94 | case 3: xrpow[upper4+2] = vec_tmp._float[2];
95 | case 2: xrpow[upper4+1] = vec_tmp._float[1];
96 | case 1: xrpow[upper4+0] = vec_tmp._float[0];
97 | default:
98 | break;
99 | }
100 | default:
101 | break;
102 | }
103 | tmp_sum = vec_sum._float[0] + vec_sum._float[1] + vec_sum._float[2] + vec_sum._float[3];
104 | {
105 | float ma = vec_xrpow_max._float[0] > vec_xrpow_max._float[1]
106 | ? vec_xrpow_max._float[0] : vec_xrpow_max._float[1];
107 | float mb = vec_xrpow_max._float[2] > vec_xrpow_max._float[3]
108 | ? vec_xrpow_max._float[2] : vec_xrpow_max._float[3];
109 | tmp_max = ma > mb ? ma : mb;
110 | }
111 | cod_info->xrpow_max = tmp_max;
112 | *sum = tmp_sum;
113 | }
114 |
115 |
116 | static void store4(__m128 v, float* f0, float* f1, float* f2, float* f3)
117 | {
118 | vecfloat_union r;
119 | r._m128 = v;
120 | *f0 = r._float[0];
121 | *f1 = r._float[1];
122 | *f2 = r._float[2];
123 | *f3 = r._float[3];
124 | }
125 |
126 |
127 | void
128 | fht_SSE2(FLOAT * fz, int n)
129 | {
130 | const FLOAT *tri = costab;
131 | int k4;
132 | FLOAT *fi, *gi;
133 | FLOAT const *fn;
134 |
135 | n <<= 1; /* to get BLKSIZE, because of 3DNow! ASM routine */
136 | fn = fz + n;
137 | k4 = 4;
138 | do {
139 | FLOAT s1, c1;
140 | int i, k1, k2, k3, kx;
141 | kx = k4 >> 1;
142 | k1 = k4;
143 | k2 = k4 << 1;
144 | k3 = k2 + k1;
145 | k4 = k2 << 1;
146 | fi = fz;
147 | gi = fi + kx;
148 | do {
149 | FLOAT f0, f1, f2, f3;
150 | f1 = fi[0] - fi[k1];
151 | f0 = fi[0] + fi[k1];
152 | f3 = fi[k2] - fi[k3];
153 | f2 = fi[k2] + fi[k3];
154 | fi[k2] = f0 - f2;
155 | fi[0] = f0 + f2;
156 | fi[k3] = f1 - f3;
157 | fi[k1] = f1 + f3;
158 | f1 = gi[0] - gi[k1];
159 | f0 = gi[0] + gi[k1];
160 | f3 = SQRT2 * gi[k3];
161 | f2 = SQRT2 * gi[k2];
162 | gi[k2] = f0 - f2;
163 | gi[0] = f0 + f2;
164 | gi[k3] = f1 - f3;
165 | gi[k1] = f1 + f3;
166 | gi += k4;
167 | fi += k4;
168 | } while (fi < fn);
169 | c1 = tri[0];
170 | s1 = tri[1];
171 | for (i = 1; i < kx; i++) {
172 | __m128 v_s2;
173 | __m128 v_c2;
174 | __m128 v_c1;
175 | __m128 v_s1;
176 | FLOAT c2, s2, s1_2 = s1+s1;
177 | c2 = 1 - s1_2 * s1;
178 | s2 = s1_2 * c1;
179 | fi = fz + i;
180 | gi = fz + k1 - i;
181 | v_c1 = _mm_set_ps1(c1);
182 | v_s1 = _mm_set_ps1(s1);
183 | v_c2 = _mm_set_ps1(c2);
184 | v_s2 = _mm_set_ps1(s2);
185 | {
186 | static const vecfloat_union sign_mask = {{0x80000000,0,0,0}};
187 | v_c1 = _mm_xor_ps(sign_mask._m128, v_c1); /* v_c1 := {-c1, +c1, +c1, +c1} */
188 | }
189 | {
190 | static const vecfloat_union sign_mask = {{0,0x80000000,0,0}};
191 | v_s1 = _mm_xor_ps(sign_mask._m128, v_s1); /* v_s1 := {+s1, -s1, +s1, +s1} */
192 | }
193 | {
194 | static const vecfloat_union sign_mask = {{0,0,0x80000000,0x80000000}};
195 | v_c2 = _mm_xor_ps(sign_mask._m128, v_c2); /* v_c2 := {+c2, +c2, -c2, -c2} */
196 | }
197 | do {
198 | __m128 p, q, r;
199 |
200 | q = _mm_setr_ps(fi[k1], fi[k3], gi[k1], gi[k3]); /* Q := {fi_k1,fi_k3,gi_k1,gi_k3}*/
201 | p = _mm_mul_ps(_mm_set_ps1(s2), q); /* P := s2 * Q */
202 | q = _mm_mul_ps(v_c2, q); /* Q := c2 * Q */
203 | q = _mm_shuffle_ps(q, q, _MM_SHUFFLE(1,0,3,2)); /* Q := {-c2*gi_k1,-c2*gi_k3,c2*fi_k1,c2*fi_k3} */
204 | p = _mm_add_ps(p, q);
205 |
206 | r = _mm_setr_ps(gi[0], gi[k2], fi[0], fi[k2]); /* R := {gi_0,gi_k2,fi_0,fi_k2} */
207 | q = _mm_sub_ps(r, p); /* Q := {gi_0-p0,gi_k2-p1,fi_0-p2,fi_k2-p3} */
208 | r = _mm_add_ps(r, p); /* R := {gi_0+p0,gi_k2+p1,fi_0+p2,fi_k2+p3} */
209 | p = _mm_shuffle_ps(q, r, _MM_SHUFFLE(2,0,2,0)); /* P := {q0,q2,r0,r2} */
210 | p = _mm_shuffle_ps(p, p, _MM_SHUFFLE(3,1,2,0)); /* P := {q0,r0,q2,r2} */
211 | q = _mm_shuffle_ps(q, r, _MM_SHUFFLE(3,1,3,1)); /* Q := {q1,q3,r1,r3} */
212 | r = _mm_mul_ps(v_c1, q);
213 | q = _mm_mul_ps(v_s1, q);
214 | q = _mm_shuffle_ps(q, q, _MM_SHUFFLE(0,1,2,3)); /* Q := {q3,q2,q1,q0} */
215 | q = _mm_add_ps(q, r);
216 |
217 | store4(_mm_sub_ps(p, q), &gi[k3], &gi[k2], &fi[k3], &fi[k2]);
218 | store4(_mm_add_ps(p, q), &gi[k1], &gi[ 0], &fi[k1], &fi[ 0]);
219 |
220 | gi += k4;
221 | fi += k4;
222 | } while (fi < fn);
223 | c2 = c1;
224 | c1 = c2 * tri[0] - s1 * tri[1];
225 | s1 = c2 * tri[1] + s1 * tri[0];
226 | }
227 | tri += 2;
228 | } while (k4 < n);
229 | }
230 |
231 | #endif /* HAVE_XMMINTRIN_H */
232 |
233 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/version.c:
--------------------------------------------------------------------------------
1 | /*
2 | * Version numbering for LAME.
3 | *
4 | * Copyright (c) 1999 A.L. Faber
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | /*!
23 | \file version.c
24 | \brief Version numbering for LAME.
25 |
26 | Contains functions which describe the version of LAME.
27 |
28 | \author A.L. Faber
29 | \version \$Id: version.c,v 1.32.2.2 2011/11/18 09:18:28 robert Exp $
30 | \ingroup libmp3lame
31 | */
32 |
33 |
34 | #ifdef HAVE_CONFIG_H
35 | # include
36 | #endif
37 |
38 |
39 | #include "lame.h"
40 | #include "machine.h"
41 |
42 | #include "version.h" /* macros of version numbers */
43 |
44 |
45 |
46 |
47 |
48 | /*! Get the LAME version string. */
49 | /*!
50 | \param void
51 | \return a pointer to a string which describes the version of LAME.
52 | */
53 | const char *
54 | get_lame_version(void)
55 | { /* primary to write screen reports */
56 | /* Here we can also add informations about compile time configurations */
57 |
58 | #if LAME_ALPHA_VERSION
59 | static /*@observer@ */ const char *const str =
60 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " "
61 | "(alpha " STR(LAME_PATCH_VERSION) ", " __DATE__ " " __TIME__ ")";
62 | #elif LAME_BETA_VERSION
63 | static /*@observer@ */ const char *const str =
64 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " "
65 | "(beta " STR(LAME_PATCH_VERSION) ", " __DATE__ ")";
66 | #elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0)
67 | static /*@observer@ */ const char *const str =
68 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) "." STR(LAME_PATCH_VERSION);
69 | #else
70 | static /*@observer@ */ const char *const str =
71 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION);
72 | #endif
73 |
74 | return str;
75 | }
76 |
77 |
78 | /*! Get the short LAME version string. */
79 | /*!
80 | It's mainly for inclusion into the MP3 stream.
81 |
82 | \param void
83 | \return a pointer to the short version of the LAME version string.
84 | */
85 | const char *
86 | get_lame_short_version(void)
87 | {
88 | /* adding date and time to version string makes it harder for output
89 | validation */
90 |
91 | #if LAME_ALPHA_VERSION
92 | static /*@observer@ */ const char *const str =
93 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " (alpha " STR(LAME_PATCH_VERSION) ")";
94 | #elif LAME_BETA_VERSION
95 | static /*@observer@ */ const char *const str =
96 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) " (beta " STR(LAME_PATCH_VERSION) ")";
97 | #elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0)
98 | static /*@observer@ */ const char *const str =
99 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) "." STR(LAME_PATCH_VERSION);
100 | #else
101 | static /*@observer@ */ const char *const str =
102 | STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION);
103 | #endif
104 |
105 | return str;
106 | }
107 |
108 | /*! Get the _very_ short LAME version string. */
109 | /*!
110 | It's used in the LAME VBR tag only.
111 |
112 | \param void
113 | \return a pointer to the short version of the LAME version string.
114 | */
115 | const char *
116 | get_lame_very_short_version(void)
117 | {
118 | /* adding date and time to version string makes it harder for output
119 | validation */
120 | #if LAME_ALPHA_VERSION
121 | #define P "a"
122 | #elif LAME_BETA_VERSION
123 | #define P "b"
124 | #elif LAME_RELEASE_VERSION && (LAME_PATCH_VERSION > 0)
125 | #define P "r"
126 | #else
127 | #define P ""
128 | #endif
129 | static /*@observer@ */ const char *const str =
130 | #if (LAME_PATCH_VERSION > 0)
131 | "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P STR(LAME_PATCH_VERSION)
132 | #else
133 | "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P
134 | #endif
135 | ;
136 | return str;
137 | }
138 |
139 | /*! Get the _very_ short LAME version string. */
140 | /*!
141 | It's used in the LAME VBR tag only, limited to 9 characters max.
142 | Due to some 3rd party HW/SW decoders, it has to start with LAME.
143 |
144 | \param void
145 | \return a pointer to the short version of the LAME version string.
146 | */
147 | const char*
148 | get_lame_tag_encoder_short_version(void)
149 | {
150 | static /*@observer@ */ const char *const str =
151 | /* FIXME: new scheme / new version counting / drop versioning here ? */
152 | "LAME" STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) P
153 | ;
154 | return str;
155 | }
156 |
157 | /*! Get the version string for GPSYCHO. */
158 | /*!
159 | \param void
160 | \return a pointer to a string which describes the version of GPSYCHO.
161 | */
162 | const char *
163 | get_psy_version(void)
164 | {
165 | #if PSY_ALPHA_VERSION > 0
166 | static /*@observer@ */ const char *const str =
167 | STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION)
168 | " (alpha " STR(PSY_ALPHA_VERSION) ", " __DATE__ " " __TIME__ ")";
169 | #elif PSY_BETA_VERSION > 0
170 | static /*@observer@ */ const char *const str =
171 | STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION)
172 | " (beta " STR(PSY_BETA_VERSION) ", " __DATE__ ")";
173 | #else
174 | static /*@observer@ */ const char *const str =
175 | STR(PSY_MAJOR_VERSION) "." STR(PSY_MINOR_VERSION);
176 | #endif
177 |
178 | return str;
179 | }
180 |
181 |
182 | /*! Get the URL for the LAME website. */
183 | /*!
184 | \param void
185 | \return a pointer to a string which is a URL for the LAME website.
186 | */
187 | const char *
188 | get_lame_url(void)
189 | {
190 | static /*@observer@ */ const char *const str = LAME_URL;
191 |
192 | return str;
193 | }
194 |
195 |
196 | /*! Get the numerical representation of the version. */
197 | /*!
198 | Writes the numerical representation of the version of LAME and
199 | GPSYCHO into lvp.
200 |
201 | \param lvp
202 | */
203 | void
204 | get_lame_version_numerical(lame_version_t * lvp)
205 | {
206 | static /*@observer@ */ const char *const features = ""; /* obsolete */
207 |
208 | /* generic version */
209 | lvp->major = LAME_MAJOR_VERSION;
210 | lvp->minor = LAME_MINOR_VERSION;
211 | #if LAME_ALPHA_VERSION
212 | lvp->alpha = LAME_PATCH_VERSION;
213 | lvp->beta = 0;
214 | #elif LAME_BETA_VERSION
215 | lvp->alpha = 0;
216 | lvp->beta = LAME_PATCH_VERSION;
217 | #else
218 | lvp->alpha = 0;
219 | lvp->beta = 0;
220 | #endif
221 |
222 | /* psy version */
223 | lvp->psy_major = PSY_MAJOR_VERSION;
224 | lvp->psy_minor = PSY_MINOR_VERSION;
225 | lvp->psy_alpha = PSY_ALPHA_VERSION;
226 | lvp->psy_beta = PSY_BETA_VERSION;
227 |
228 | /* compile time features */
229 | /*@-mustfree@ */
230 | lvp->features = features;
231 | /*@=mustfree@ */
232 | }
233 |
234 |
235 | const char *
236 | get_lame_os_bitness(void)
237 | {
238 | static /*@observer@ */ const char *const strXX = "";
239 | static /*@observer@ */ const char *const str32 = "32bits";
240 | static /*@observer@ */ const char *const str64 = "64bits";
241 |
242 | switch (sizeof(void *)) {
243 | case 4:
244 | return str32;
245 |
246 | case 8:
247 | return str64;
248 |
249 | default:
250 | return strXX;
251 | }
252 | }
253 |
254 | /* end of version.c */
255 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_3.99.5_libmp3lame/version.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Version numbering for LAME.
3 | *
4 | * Copyright (c) 1999 A.L. Faber
5 | *
6 | * This library is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU Library General Public
8 | * License as published by the Free Software Foundation; either
9 | * version 2 of the License, or (at your option) any later version.
10 | *
11 | * This library is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 | * Library General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU Library General Public
17 | * License along with this library; if not, write to the
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 | * Boston, MA 02111-1307, USA.
20 | */
21 |
22 | #ifndef LAME_VERSION_H
23 | #define LAME_VERSION_H
24 |
25 |
26 | /*
27 | * To make a string from a token, use the # operator:
28 | */
29 | #ifndef STR
30 | # define __STR(x) #x
31 | # define STR(x) __STR(x)
32 | #endif
33 |
34 | # define LAME_URL "http://lame.sf.net"
35 |
36 |
37 | # define LAME_MAJOR_VERSION 3 /* Major version number */
38 | # define LAME_MINOR_VERSION 99 /* Minor version number */
39 | # define LAME_TYPE_VERSION 2 /* 0:alpha 1:beta 2:release */
40 | # define LAME_PATCH_VERSION 5 /* Patch level */
41 | # define LAME_ALPHA_VERSION (LAME_TYPE_VERSION==0)
42 | # define LAME_BETA_VERSION (LAME_TYPE_VERSION==1)
43 | # define LAME_RELEASE_VERSION (LAME_TYPE_VERSION==2)
44 |
45 | # define PSY_MAJOR_VERSION 1 /* Major version number */
46 | # define PSY_MINOR_VERSION 0 /* Minor version number */
47 | # define PSY_ALPHA_VERSION 0 /* Set number if this is an alpha version, otherwise zero */
48 | # define PSY_BETA_VERSION 0 /* Set number if this is a beta version, otherwise zero */
49 |
50 | #if LAME_ALPHA_VERSION
51 | #define LAME_PATCH_LEVEL_STRING " alpha " STR(LAME_PATCH_VERSION)
52 | #endif
53 | #if LAME_BETA_VERSION
54 | #define LAME_PATCH_LEVEL_STRING " beta " STR(LAME_PATCH_VERSION)
55 | #endif
56 | #if LAME_RELEASE_VERSION
57 | #if LAME_PATCH_VERSION
58 | #define LAME_PATCH_LEVEL_STRING " release " STR(LAME_PATCH_VERSION)
59 | #else
60 | #define LAME_PATCH_LEVEL_STRING ""
61 | #endif
62 | #endif
63 |
64 | # define LAME_VERSION_STRING STR(LAME_MAJOR_VERSION) "." STR(LAME_MINOR_VERSION) LAME_PATCH_LEVEL_STRING
65 |
66 | #endif /* LAME_VERSION_H */
67 |
68 | /* End of version.h */
69 |
--------------------------------------------------------------------------------
/library/src/main/jni/lame_util.c:
--------------------------------------------------------------------------------
1 | #include "lame_3.99.5_libmp3lame/lame.h"
2 | #include "com_czt_mp3recorder_util_LameUtil.h"
3 | #include
4 | #include
5 |
6 | static lame_global_flags *lame = NULL;
7 |
8 | JNIEXPORT void JNICALL Java_com_czt_mp3recorder_util_LameUtil_init(
9 | JNIEnv *env, jclass cls, jint inSamplerate, jint inChannel, jint outSamplerate, jint outBitrate, jint quality) {
10 | if (lame != NULL) {
11 | lame_close(lame);
12 | lame = NULL;
13 | }
14 | lame = lame_init();
15 | lame_set_in_samplerate(lame, inSamplerate);
16 | lame_set_num_channels(lame, inChannel);//输入流的声道
17 | lame_set_out_samplerate(lame, outSamplerate);
18 | lame_set_brate(lame, outBitrate);
19 | lame_set_quality(lame, quality);
20 | lame_init_params(lame);
21 | }
22 |
23 | JNIEXPORT jint JNICALL Java_com_czt_mp3recorder_util_LameUtil_encode(
24 | JNIEnv *env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,
25 | jint samples, jbyteArray mp3buf) {
26 | jshort* j_buffer_l = (*env)->GetShortArrayElements(env, buffer_l, NULL);
27 |
28 | jshort* j_buffer_r = (*env)->GetShortArrayElements(env, buffer_r, NULL);
29 |
30 | const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf);
31 | jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL);
32 |
33 | int result = lame_encode_buffer(lame, j_buffer_l, j_buffer_r,
34 | samples, j_mp3buf, mp3buf_size);
35 |
36 | (*env)->ReleaseShortArrayElements(env, buffer_l, j_buffer_l, 0);
37 | (*env)->ReleaseShortArrayElements(env, buffer_r, j_buffer_r, 0);
38 | (*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0);
39 |
40 | return result;
41 | }
42 |
43 | JNIEXPORT jint JNICALL Java_com_czt_mp3recorder_util_LameUtil_flush(
44 | JNIEnv *env, jclass cls, jbyteArray mp3buf) {
45 | const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf);
46 | jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL);
47 |
48 | int result = lame_encode_flush(lame, j_mp3buf, mp3buf_size);
49 |
50 | (*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0);
51 |
52 | return result;
53 | }
54 |
55 | JNIEXPORT void JNICALL Java_com_czt_mp3recorder_util_LameUtil_close
56 | (JNIEnv *env, jclass cls) {
57 | lame_close(lame);
58 | lame = NULL;
59 | }
60 |
--------------------------------------------------------------------------------
/library/src/main/jniLibs/arm64-v8a/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/arm64-v8a/libmp3lame.so
--------------------------------------------------------------------------------
/library/src/main/jniLibs/armeabi-v7a/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/armeabi-v7a/libmp3lame.so
--------------------------------------------------------------------------------
/library/src/main/jniLibs/armeabi/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/armeabi/libmp3lame.so
--------------------------------------------------------------------------------
/library/src/main/jniLibs/mips/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/mips/libmp3lame.so
--------------------------------------------------------------------------------
/library/src/main/jniLibs/mips64/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/mips64/libmp3lame.so
--------------------------------------------------------------------------------
/library/src/main/jniLibs/x86/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/x86/libmp3lame.so
--------------------------------------------------------------------------------
/library/src/main/jniLibs/x86_64/libmp3lame.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/library/src/main/jniLibs/x86_64/libmp3lame.so
--------------------------------------------------------------------------------
/sample/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "23.0.2"
6 |
7 | defaultConfig {
8 | applicationId "com.czt.mp3recorder.sample"
9 | minSdkVersion 11
10 | targetSdkVersion 23
11 | }
12 |
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | compile project(':library')
23 | compile 'com.android.support:support-v4:23.1.1'
24 | }
25 |
--------------------------------------------------------------------------------
/sample/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/sample/src/main/java/com/czt/mp3recorder/sample/MainActivity.java:
--------------------------------------------------------------------------------
1 |
2 | package com.czt.mp3recorder.sample;
3 |
4 | import java.io.File;
5 |
6 | import android.app.Activity;
7 | import android.os.Bundle;
8 | import android.os.Environment;
9 | import android.util.Log;
10 | import android.view.View;
11 | import android.view.View.OnClickListener;
12 | import android.widget.Button;
13 | import android.widget.Toast;
14 |
15 | import com.czt.mp3recorder.MP3Recorder;
16 | import com.czt.mp3recorder.RecordExceptionListener;
17 |
18 | public class MainActivity extends Activity {
19 |
20 | private MP3Recorder mRecorder = new MP3Recorder(new File(Environment.getExternalStorageDirectory(),"test.mp3"));
21 |
22 | @Override
23 | public void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.main);
26 |
27 | final Button startButton = (Button) findViewById(R.id.StartButton);
28 | startButton.setOnClickListener(new OnClickListener() {
29 | @Override
30 | public void onClick(View v) {
31 | mRecorder.start();
32 | Toast.makeText(getApplicationContext(),"开始录音",Toast.LENGTH_LONG).show();
33 | }
34 | });
35 | Button stopButton = (Button) findViewById(R.id.StopButton);
36 | stopButton.setOnClickListener(new OnClickListener() {
37 | @Override
38 | public void onClick(View v) {
39 | mRecorder.stop();
40 | Toast.makeText(getApplicationContext(),"结束录音",Toast.LENGTH_LONG).show();
41 |
42 | }
43 | });
44 |
45 | mRecorder.setRecordExceptionListener(new RecordExceptionListener() {
46 | @Override
47 | public void onError(final Throwable e) {
48 | e.printStackTrace();
49 | runOnUiThread(new Runnable() {
50 | @Override
51 | public void run() {
52 | Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
53 | }
54 | });
55 | }
56 | });
57 | }
58 |
59 | @Override
60 | protected void onDestroy() {
61 | super.onDestroy();
62 | mRecorder.stop();
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/sample/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/sample/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/sample/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/sample/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Jay-Goo/AndroidMP3Recorder/51c313dbcc6a19dd0024d0782972c263102bafe7/sample/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/sample/src/main/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
18 |
19 |
25 |
26 |
27 |
31 |
32 |
--------------------------------------------------------------------------------
/sample/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | MP3RecordSample
4 |
5 |
6 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':library'
2 | include ':sample'
3 |
--------------------------------------------------------------------------------