Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update lame-mp3-utils.cpp #10

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 77 additions & 39 deletions library/src/main/cpp/lame-mp3-utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,25 @@
#include"jni.h"
#include"lamemp3/lame.h"
#include"android/log.h"

#define LOG_TAG "lameUtils"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define BUFFER_SIZE 8192

static lame_global_flags *lame = NULL;
long nowConvertBytes = 0;

struct lame_config {
int inSampleRate = 44100;
int channel = 2;
int mode = 0;
int outSampleRate = 44100;
int outBitRate = 96;
int quality = 7;
};

lame_config default_lame_config;

void resetLame() {
if (lame != NULL) {
lame_close(lame);
Expand All @@ -18,14 +30,13 @@ void resetLame() {
}


unsigned char* convertJByteArrayToChars(JNIEnv *env, jbyteArray bytearray)
{
unsigned char *convertJByteArrayToChars(JNIEnv *env, jbyteArray bytearray) {
unsigned char *chars = NULL;
jbyte *bytes;
bytes = env->GetByteArrayElements(bytearray, 0);
int chars_len = env->GetArrayLength(bytearray);
chars = new unsigned char[chars_len + 1];
memset(chars,0,chars_len + 1);
memset(chars, 0, chars_len + 1);
memcpy(chars, bytes, chars_len);
chars[chars_len] = 0;
env->ReleaseByteArrayElements(bytearray, bytes, 0);
Expand All @@ -36,63 +47,93 @@ void lameInit(jint inSampleRate,
jint channel, jint mode, jint outSampleRate,
jint outBitRate, jint quality) {
resetLame();
//记录参数
default_lame_config.inSampleRate = inSampleRate;
default_lame_config.channel = channel;
default_lame_config.mode = mode;
default_lame_config.outSampleRate = outSampleRate;
default_lame_config.outBitRate = outBitRate;
default_lame_config.quality = quality;

lame = lame_init();
lame_set_in_samplerate(lame, inSampleRate);
lame_set_num_channels(lame, channel);
lame_set_out_samplerate(lame, outSampleRate);
lame_set_brate(lame, outBitRate);
lame_set_quality(lame, quality);
if(mode == 0) { // use CBR
if (mode == 0) { // use CBR
lame_set_VBR(lame, vbr_default);
} else if(mode == 1){ //use VBR
} else if (mode == 1) { //use VBR
lame_set_VBR(lame, vbr_abr);
} else{ // use ABR
} else { // use ABR
lame_set_VBR(lame, vbr_mtrh);
}
lame_init_params(lame);
}

extern "C" JNIEXPORT void JNICALL
Java_jaygoo_library_converter_Mp3Converter_init(JNIEnv *env, jclass type, jint inSampleRate,
jint channel, jint mode, jint outSampleRate,
jint outBitRate, jint quality) {
jint channel, jint mode, jint outSampleRate,
jint outBitRate, jint quality) {
lameInit(inSampleRate, channel, mode, outSampleRate, outBitRate, quality);
}

extern "C" JNIEXPORT
void JNICALL Java_jaygoo_library_converter_Mp3Converter_convertMp3
(JNIEnv * env, jobject obj, jstring jInputPath, jstring jMp3Path) {
const char* cInput = env->GetStringUTFChars(jInputPath, 0);
const char* cMp3 = env->GetStringUTFChars(jMp3Path, 0);
(JNIEnv *env, jclass obj, jstring jInputPath, jstring jMp3Path) {
const char *cInput = env->GetStringUTFChars(jInputPath, 0);
const char *cMp3 = env->GetStringUTFChars(jMp3Path, 0);
//open input file and output file
FILE* fInput = fopen(cInput,"rb");
FILE* fMp3 = fopen(cMp3,"wb");
FILE *fInput = fopen(cInput, "rb");
FILE *fMp3 = fopen(cMp3, "wb");
short int inputBuffer[BUFFER_SIZE * 2];
unsigned char mp3Buffer[BUFFER_SIZE];//You must specified at least 7200
int read = 0; // number of bytes in inputBuffer, if in the end return 0
int write = 0;// number of bytes output in mp3buffer. can be 0
long total = 0; // the bytes of reading input file
nowConvertBytes = 0;
//if you don't init lame, it will init lame use the default value
if(lame == NULL){
lameInit(44100, 2, 0, 44100, 96, 7);
if (lame == NULL) {
lameInit(
default_lame_config.inSampleRate,
default_lame_config.channel,
default_lame_config.mode,
default_lame_config.outSampleRate,
default_lame_config.outBitRate,
default_lame_config.quality
);
}

int channel_num = lame_get_num_channels(lame);
//convert to mp3
do{
read = static_cast<int>(fread(inputBuffer, sizeof(short int) * 2, BUFFER_SIZE, fInput));
total += read * sizeof(short int)*2;
do {
if (channel_num == 1) {
//单声道
read = static_cast<int>(fread(inputBuffer, sizeof(short int), BUFFER_SIZE, fInput));
total += read * sizeof(short int);
} else {
//双声道
read = static_cast<int>(fread(inputBuffer, sizeof(short int) * 2, BUFFER_SIZE, fInput));
total += read * sizeof(short int) * 2;
}
nowConvertBytes = total;
if(read != 0){
write = lame_encode_buffer_interleaved(lame, inputBuffer, read, mp3Buffer, BUFFER_SIZE);
if (read != 0) {
if (channel_num == 1) {
//单声道
write = lame_encode_buffer(lame, inputBuffer, NULL, read, mp3Buffer,
BUFFER_SIZE);
} else {
//双声道
write = lame_encode_buffer_interleaved(lame, inputBuffer, read, mp3Buffer,
BUFFER_SIZE);
}
//write the converted buffer to the file
fwrite(mp3Buffer, sizeof(unsigned char), static_cast<size_t>(write), fMp3);
}
//if in the end flush
if(read == 0){
lame_encode_flush(lame,mp3Buffer, BUFFER_SIZE);
if (read == 0) {
lame_encode_flush(lame, mp3Buffer, BUFFER_SIZE);
}
}while(read != 0);
} while (read != 0);

//release resources
resetLame();
Expand All @@ -105,18 +146,18 @@ void JNICALL Java_jaygoo_library_converter_Mp3Converter_convertMp3

extern "C" JNIEXPORT int JNICALL
Java_jaygoo_library_converter_Mp3Converter__encode(
JNIEnv * env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,
jint samples, jbyteArray mp3buf) {
jshort* j_buffer_l = env->GetShortArrayElements(buffer_l, NULL);
JNIEnv *env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,
jint samples, jbyteArray mp3buf) {
jshort *j_buffer_l = env->GetShortArrayElements(buffer_l, NULL);

jshort* j_buffer_r = env->GetShortArrayElements(buffer_r, NULL);
jshort *j_buffer_r = env->GetShortArrayElements(buffer_r, NULL);

const jsize mp3buf_size = env->GetArrayLength(mp3buf);
unsigned char * c_mp3buf = convertJByteArrayToChars(env, mp3buf);
unsigned char *c_mp3buf = convertJByteArrayToChars(env, mp3buf);
int result = lame_encode_buffer(lame, j_buffer_l, j_buffer_r,
samples, c_mp3buf, mp3buf_size);

env-> ReleaseShortArrayElements(buffer_l, j_buffer_l, 0);
env->ReleaseShortArrayElements(buffer_l, j_buffer_l, 0);
env->ReleaseShortArrayElements(buffer_r, j_buffer_r, 0);
*c_mp3buf = NULL;
return result;
Expand All @@ -126,9 +167,9 @@ Java_jaygoo_library_converter_Mp3Converter__encode(

extern "C" JNIEXPORT int JNICALL
Java_jaygoo_library_converter_Mp3Converter__flush(
JNIEnv *env, jclass cls, jbyteArray mp3buf) {
JNIEnv *env, jclass cls, jbyteArray mp3buf) {
const jsize mp3buf_size = env->GetArrayLength(mp3buf);
unsigned char * c_mp3buf = convertJByteArrayToChars(env, mp3buf);
unsigned char *c_mp3buf = convertJByteArrayToChars(env, mp3buf);

int result = lame_encode_flush(lame, c_mp3buf, mp3buf_size);

Expand All @@ -137,17 +178,14 @@ Java_jaygoo_library_converter_Mp3Converter__flush(
}

extern "C" JNIEXPORT jstring JNICALL
Java_jaygoo_library_converter_Mp3Converter_close
(JNIEnv *env, jclass cls) {
lame_close(lame);
lame = NULL;
Java_jaygoo_library_converter_Mp3Converter_close(JNIEnv *env, jclass cls) {
resetLame();
}


extern "C" JNIEXPORT jstring JNICALL
Java_jaygoo_library_converter_Mp3Converter_getLameVersion(
JNIEnv *env, jobject /* this */) {
return env->NewStringUTF(get_lame_version());
Java_jaygoo_library_converter_Mp3Converter_getLameVersion(JNIEnv *env, jobject /* this */) {
return env->NewStringUTF(get_lame_version());
}

extern "C" JNIEXPORT jlong JNICALL
Expand Down