📄 exportmp3.cpp
字号:
if( gMP3Exporter ) delete gMP3Exporter; gMP3Exporter = NULL;}#elif defined(__WXMAC__) /* --------------------------------------------------------------------------*/ /* The following code is intended to work with LAMELib, roughly LAME verson 3.87, as distributed by N2MP3. */ typedef struct { /* input file description */ unsigned long num_samples; /* number of samples. default=2^32-1 */ int num_channels; /* input number of channels. default=2 */ int in_samplerate; /* input_samp_rate. default=44.1kHz */ int out_samplerate; /* output_samp_rate. (usually determined automatically) */ float scale; /* scale input by this amount */ /* general control params */ int gtkflag; /* run frame analyzer? */ int bWriteVbrTag; /* add Xing VBR tag? */ int disable_waveheader; /* disable writing of .wav header, when *decoding* */ int decode_only; /* use lame/mpglib to convert mp3 to wav */ int ogg; /* encode to Vorbis .ogg file */ int quality; /* quality setting 0=best, 9=worst */ int silent; /* disable some status output */ float update_interval; /* to use Frank's time status display */ int brhist_disp; /* enable VBR bitrate histogram display */ int mode; /* 0,1,2,3 stereo,jstereo,dual channel,mono */ int mode_fixed; /* use specified the mode, do not use lame's opinion of the best mode */ int force_ms; /* force M/S mode. requires mode=1 */ int brate; /* bitrate */ float compression_ratio; /* user specified compression ratio, instead of brate */ int free_format; /* use free format? */ int space[10000]; /* to liberally accomadate for the real size of the struct */ } lame_global_flags; /* All functions types are suffexed with _t because gcc won't let you have a * type and a variable of the same name */ typedef void lame_init_t(lame_global_flags *); /* NOTE: Same deal with this one: >= 3.88 changes it to: const char * *get_lame_version(), but this time they don't even leave us a * compatibility version! aggh! */ typedef void lame_version_t(lame_global_flags *, char *); typedef const char *get_lame_version_t(); typedef void lame_init_params_t(lame_global_flags*); typedef int lame_encode_buffer_t ( lame_global_flags* gf, const short int buffer_l [], const short int buffer_r [], const int nsamples, unsigned char * mp3buf, const int mp3buf_size ); typedef int lame_encode_buffer_interleaved_t( lame_global_flags* gf, short int pcm[], int num_samples, /* per channel */ unsigned char* mp3buf, int mp3buf_size ); typedef int lame_encode_finish_t( lame_global_flags *gf, unsigned char* mp3buf, int size ); /* --------------------------------------------------------------------------*/ class MacLAMEExporter : public MP3Exporter { private: lame_init_t* lame_init; lame_version_t* lame_version; get_lame_version_t* get_lame_version; lame_init_params_t* lame_init_params; lame_encode_buffer_t* lame_encode_buffer; lame_encode_finish_t* lame_encode_finish; lame_global_flags *mGF; bool mLibraryLoaded, mEncoding; char mVersion[20]; static const int mSamplesPerChunk = 220500; static const int mOutBufferSize = int(1.25 * mSamplesPerChunk + 7200); short int *mLeftBuffer; short int *mRightBuffer; public: MacLAMEExporter() { mLibraryLoaded = false; mEncoding = false; mGF = NULL; } wxString GetLibraryPath() { return wxT(""); } wxString GetLibraryName() { return wxT("LAMELib"); } wxString GetLibraryTypeString() { return _("Only LAMELib|LAMELib|Shared Libraries (*)|*"); } wxString GetLibraryMessage() { // Must be <= 255 characters on Mac /* i18n-hint: This message is used on Mac OS 9. This particular message must be <= 255 characters. Be brief. */ return _("Audacity does not export MP3 files directly, but instead uses LAME, " "an MP3 exporting library available separately. See the documentation " "for more information.\n\n" "Would you like to locate LameLib now?"); } bool LoadLibrary() { wxLogNull logNo; //BG: I was unable to test the wxDynamicLibrary code on this platform if (wxFileExists(FILENAME(mLibPath))) { if(lame_enc_lib.IsLoaded()) { lame_enc_lib.Unload(); } if(!lame_enc_lib.Load(FILENAME(mLibPath))) { return false; } } else return false; lame_init = (lame_init_t *) lame_enc_lib.GetSymbol("lame_init"); lame_version = (lame_version_t *) lame_enc_lib.GetSymbol("lame_version"); get_lame_version = (get_lame_version_t *) lame_enc_lib.GetSymbol("get_lame_version"); lame_init_params = (lame_init_params_t *) lame_enc_lib.GetSymbol("lame_init_params"); lame_encode_buffer = (lame_encode_buffer_t *) lame_enc_lib.GetSymbol("lame_encode_buffer"); lame_encode_finish = (lame_encode_finish_t *) lame_enc_lib.GetSymbol("lame_encode_finish"); if (!lame_init || !lame_init_params || !lame_encode_buffer || !(lame_version || get_lame_version) || !lame_encode_finish) { return false; } mGF = new lame_global_flags; lame_init(mGF); mLibraryLoaded = true; return true; } bool ValidLibraryLoaded() { return mLibraryLoaded; } wxString GetLibraryVersion() { if(!mLibraryLoaded) return wxT(""); if(get_lame_version) return get_lame_version(); else { lame_version(mGF, mVersion); return mVersion; } } int InitializeStream(int channels, int sampleRate) { if(!mLibraryLoaded) return -1; mGF->num_channels = channels; mGF->in_samplerate = sampleRate; mGF->out_samplerate = sampleRate; mGF->num_samples = 0; if (channels == 1) mGF->mode = 3; // mono else mGF->mode = 1; // joint stereo lame_init_params(mGF); mLeftBuffer = new short[mSamplesPerChunk]; mRightBuffer = new short[mSamplesPerChunk]; mEncoding = true; return mSamplesPerChunk; } int GetOutBufferSize() { return mOutBufferSize; } int GetConfigurationCaps() { return MP3CONFIG_BITRATE; } int EncodeBuffer(short int inbuffer[], unsigned char outbuffer[]) { if(!mEncoding) return -1; if (mGF->num_channels == 2) { for(int i=0; i<mSamplesPerChunk; i++) { mLeftBuffer[i] = inbuffer[2*i]; mRightBuffer[i] = inbuffer[2*i+1]; } return lame_encode_buffer(mGF, mLeftBuffer, mRightBuffer, mSamplesPerChunk, outbuffer, mOutBufferSize); } else { return lame_encode_buffer(mGF, inbuffer, inbuffer, mSamplesPerChunk, outbuffer, mOutBufferSize); } } int EncodeRemainder(short int inbuffer[], int nSamples, unsigned char outbuffer[]) { if (mGF->num_channels == 2) { for(int i=0; i<nSamples; i++) { mLeftBuffer[i] = inbuffer[2*i]; mRightBuffer[i] = inbuffer[2*i+1]; } return lame_encode_buffer(mGF, mLeftBuffer, mRightBuffer, nSamples, outbuffer, mOutBufferSize); } else { return lame_encode_buffer(mGF, inbuffer, inbuffer, nSamples, outbuffer, mOutBufferSize); } } int FinishStream(unsigned char outbuffer[]) { mEncoding = false; int result = lame_encode_finish(mGF, outbuffer, mOutBufferSize); delete[] mLeftBuffer; delete[] mRightBuffer; return result; } void CancelEncoding() { mEncoding = false; } int GetQualityVariance() { return -1; } void SetBitrate(int rate) { } int GetBitrate() { return -1; } void SetQuality(int quality) { } int GetQuality() { return -1; } };MP3Exporter *gMP3Exporter = NULL;MP3Exporter *GetMP3Exporter(){ if (!gMP3Exporter) gMP3Exporter = new MacLAMEExporter(); return gMP3Exporter;}void ReleaseMP3Exporter(){ if( gMP3Exporter ) delete gMP3Exporter; gMP3Exporter = NULL;}#elif defined(__WXMSW__)#include "BladeMP3EncDLL.h"class BladeEncExporter : public MP3Exporter {private: BE_CONFIG mConf; BE_VERSION mVersion; HBE_STREAM mStreamHandle; bool mLibraryLoaded, mEncoding,mStereo; unsigned long mOutBufferSize, mInSampleNum; int mDefaultRate; BEINITSTREAM beInitStream; BEENCODECHUNK beEncodeChunk; BEDEINITSTREAM beDeinitStream; BECLOSESTREAM beCloseStream; BEVERSION beVersion;public: BladeEncExporter() { mLibraryLoaded = false; mEncoding = false; /* Set all the config defaults to sane values */ memset(&mConf, 0, sizeof(BE_CONFIG));// mConf.dwConfig = BE_CONFIG_LAME;// mConf.format.LHV1.dwStructVersion = 1;// mConf.format.LHV1.dwStructSize = sizeof(BE_CONFIG);// mConf.format.LHV1.dwReSampleRate = 0;// mConf.format.LHV1.dwBitrate = 128; //mConf.format.LHV1.dwMaxBitrate = 128;// mConf.format.LHV1.nPreset = LQP_HIGH_QUALITY;// mConf.format.LHV1.dwMpegVersion = MPEG1;// mConf.format.LHV1.bCopyright = false;// mConf.format.LHV1.bCRC = true;// mConf.format.LHV1.bOriginal = false;// mConf.format.LHV1.bPrivate = false;// mConf.format.LHV1.bWriteVBRHeader = false;// mConf.format.LHV1.bEnableVBR = true;// mConf.format.LHV1.nVBRQuality = 2;// mConf.format.LHV1.dwVbrAbr_bps = -1;// mConf.format.LHV1.bNoRes = true; mConf.dwConfig = BE_CONFIG_MP3; mConf.format.mp3.wBitrate = 128; mConf.format.mp3.bCopyright = false; mConf.format.mp3.bCRC = true; mConf.format.mp3.bOriginal = false; mConf.format.mp3.bPrivate = false; mDefaultRate = 128; } wxString GetLibraryPath() { return wxT(""); } wxString GetLibraryName() { return wxT("lame_enc.dll"); } wxString GetLibraryTypeString() { return _("Only lame_enc.dll|lame_enc.dll|Dynamically Linked Libraries (*.dll)|*.dll|All Files (*.*)|*"); } wxString GetLibraryMessage() { /* i18n-hint: This message is used on Windows. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -