• mptkcodec工程(二):VS2008+Win7 编译 mptkcodec(上)


    注:该mptkcodec工程来自http://manusourcecode.googlecode.com/svn/mptkcodec

    1.在linux或cygwin下编译得到mpkt.h和mpktcodec.h拷贝到trunk下自建的inc目录下。拷贝dsp_windows.h(来自libdsp_windows目录),拷贝mp_system.h到inc目录下。

    在mpkt.h中加入加入

    #include <string.h>
    #include <math.h>
    #define round(x) floor(x+0.5) //??

    #ifndef M_PI
    #define M_PI 3.14159265358979323846
    #endif
    #define VERSION "0.5.2"

    在mptkcodec.h加入

    #include <math.h>
    __inline double log2(double n)
    {
    return (log(n)/log(2.0));
    }

    改#define FFT_WISDOM 1 为 #define FFT_WISDOM 0

    2.拷贝fftw3.h和sndfile.h到inc目录下。

    3.建立libdsp_windows工程,生成静态lib库。注意,dsp_windows.c需要增加包含#include <math.h>和

    #ifndef M_PI
    #define M_PI 3.14159265358979323846
    #endif

    因为若不包含math.h文件,sin和cos无法计算,可以编译通过,但是会计算出错。而M_PI不在windows的math.h中要自己增加。

    4.建立libmpkt静态库工程。修改如下部分

    4.1 把所有的不定长度的数组申请改为malloc申请。注意释放,尤其在函数有多个出口的时候。linux支持数组不定长度申请,而windows不支持。

    例如在atom.cpp 中

    原申请数组

    MP_Sample_t totalBuffer[totalChanLen];

    这样在windows无法编译,

    要改为

    MP_Sample_t *totalBuffer = (MP_Sample_t *)malloc(sizeof(MP_Sample_t)*totalChanLen);

    (注意释放)

    4.2

    把所有的fopen中的“w”或“r”改为“wb”,“rb”。否则在linux下的“w”、“r”会生成0x0A,而windows会产生0x0d,0x0a

    4.3

    把mp_messaging.cpp内的snprintf改为_snprintf.在windows无snprintf函数,有_snprintf函数。

    在mp_messaging.cpp包含

    #include <stdio.h>
    #include <stdarg.h>。

    4.4 删掉anywave_table_scanner.cpp的#include <unistd.h>

    4.5 在mtrand.c加入#include <math.h>

    5. 建立libmptkcodec工程

    5.1 把所有的不定长度的数组申请改为malloc申请。注意释放,

    5.2 在pow(2,x)这样的函数调用中,把2改为浮点表示2.0

    6 根据makefile的提示,建立各个需要生成的win32控制台程序工程。

    有mptkcodec_convert,mptkcodec_snr,mptkcodec_decompose_code,mptkcodec_decompose,mptkcodec_code,mptkcodec_decode,mptkcodec_synth。

    6.1 删除部分文件中的#include <sys/time.h>

    6.2 把所有的“w”,“r”改为“wb”,“rb”。

    6.3 windows没有gettimeofday函数,在inc目录下建立gettimeofday.h工程,加入如下代码

    /*********************/

    #include <winsock.h>

    __inline int gettimeofday(struct timeval* tv)

    {
    union {
    long long ns100;
    FILETIME ft;
    } now;

    GetSystemTimeAsFileTime (&now.ft);
    tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
    tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);
    return (0);
    }

    /********************/

    在用到gettimeofday函数的工程文件中加入#include <gettimeofday.h>。

    7. 注意所有工程的输出目录改为trunk下的output目录,设置include目录,设置lib目录,把sndfile的lib库和fftw3的lib库拷贝到指定目录下。

  • 相关阅读:
    省市县三级联动
    ajax的封装及调用(版本二-面向对象)
    Vue Element-Ui 改变el-Input背景样式
    StringUtils工具类常用方法汇总:判空、转换、移除、替换、反转。
    keep-alive 用法 及activated,deactivated这两个生命周期函数
    深入理解vue中的slot与slot-scope
    Vue2.0 v-for 中 :key 到底有什么用?
    Element-UI中关于table表格的样式操作
    子组件props接受父组件传递的值 能修改吗?
    vue iviem UI grid布局
  • 原文地址:https://www.cnblogs.com/gaozehua/p/2223133.html
Copyright © 2020-2023  润新知