Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿

置顶随笔

gaudio是一个基于C/C++混合编程的跨平台音频库,当前支持windows32操作系统和linux32位操作系统

修改记录
1.2013.04.01
    初次发布
2.2013.04.10
    完成对wav格式采样频率8000-48000,采样格式4,8,16,24,32的支持     
3.2013.05.01
    a.版本提升为1.4.0.8
    b.修改一个退出异常
    c.支持二源混音
    d.使用载入插件的方式提供对wav播放的支持
    e.增加对au格式的支持
    f.增加echo音效
    g.增加bassboost音效
    h.增加函数gaudio_address_get
    i.增加使用例子:echo/mixer/stream/boost
    j.把设置,获取音源三维空间信息的函数调整为: gaudio_source_set_float3,gaudio_source_get_float3
    k.修改解码器结构为回调模式
4.2013.05.10
    a.版本提升为1.6.8.0
    b.优化部分代码
    c.增加speedchanger音效
    d.增加音频翻转(g168)
    e.增加音频声道交换(g168)
    f.增加声道合并(g168)
    g.增加speedchanger/invert测试用例
    h.增加vc调用静态链接库libgaudio.lib
    i.增加调制音效和测试例子
    j.修改解码器框架
    k.修改获取音频采样编码格式不正确的问题
    l.解决seek定位不准的问题
    m.增加音效链测试例子
    n.增加函数gaudio_set_long,gaudio_get_long
    o.修改stream例子
    p.支持压缩mpc音频格式
    q.支持ogg/vorbis格式
    r.修改获取采样格式错误的bug
    t.增加接口说明文档    
5.2013.06.10
    a.版本提升为1.7.2.0
    b.gaudio_source_set_error_callback回调函数增加音源参数
    c.gaudio_source_set_finish_callback回调函数增加音源参数
    d.移除gaudio_get_version函数
    e.gaudio_effect_setcallback函数调整为gaudio_effect_set_callback
    f.使用插件式的音频驱动模式 - gwinmm
    g.gaudio代码优化
    h.增加音频源码率的获取
    i.增加feature范例
    j.完善文档
    k.增加对mp3的支持
    l.移除invert/modulator/bassboost例子
    m.增加balance
6.2013.07.07
    a.版本提升到1.8.0.2
    b.增加对交换文件aiff的支持
    c.修改音频驱动插件实现
    d.增加移相器音效
    e.修改部分API接口使用的long为int32_t以方便移植
    f.增加code::blocks测试工程
    g.增加msvc2008测试工程
    h.增加函数接口gaudio_source_create_from_buffer2以播放raw音频数据
    i.把各个音效参数提到单独文件
    j.简化wav解码
    k.修改几处内存泄漏
    l.增加音频回录功能,输出格式MP2,MP3,APE,WV,AAC,WAV,AU,AIFF,VOC,CAF,OGG
    当前录制信息:16位音频,双声道,采样频率44100
    m.增加音频回录的例子recorder
    n.测试例子使用getopt和usage提示
    o.增加对tta格式的支持    
7.2013.07.28
    a.版本提升到1.9.8.6                   
    b.解决了wav,au,aiff播放进度不准的故障
    c.优化wav/au/aiff解码性能        
    d.增加distortion音效              
    e.增加foldback distortion音效       
    f.增加distortion音效使用例子       
    g.增加声音穿透力                      
    h.修改结构最大支持八声道             
    i.增加portaudio插件驱动(win32&linux)  
    j.完成g168,bassbost的liux版本     
    k.完成wav,au音频格式的linux版本      
    l.代码增加部分注释(未完成)            
    m.尝试性支持linux操作系统             
    n.支持midi/mid音乐格式             
    o.解决了mixer混音退出报错的问题
    p.skip id3v2    
8.2013.08.16
    a.版本提升到2.0.0.1                    
    b.变量宏增加AUDIO_ENUM前缀
    c.增加非标准插件gsndfile支持flac/ogg/au/wav/aiff/voc/caf/..基于(sndfile)
    d.改用mpg123解码mp3
    e.支持FFT频谱
9.2013.09.08
    a.版本提升到2.0.6.0
    b.修改CROSSFEED宏和相关    
    c.引入200号插件支持s3m/mod/it/xm音频格式
    d.整理测试用例
    e.增加autowah音效
    f.增加驱动检测
10.2015.12.10 版本2.2.1.0
支持常见音频格式和音效,使用超级方便
下载在这里:/Files/gaimor/gaudio-sdk-2.2.1.0.zip

    
 
posted @ 2013-07-11 22:49 ccsdu2009 阅读(4235) | 评论 (2)编辑 收藏

2017年9月20日

生成的dmp文件提示错误
ExceptionAddress: 7c812fd3 (kernel32+0x00012fd3)
   ExceptionCode: c06d007f
  ExceptionFlags: 00000000
NumberParameters: 1
   Parameter[0]: 0012f7b0

执行 dds 0012f7b0
显示:
0:000> dds 0012f7b0
0012f7b0  00000024
0012f7b4  038d96d4 libcef!_DELAY_IMPORT_DESCRIPTOR_dbghelp_dll
0012f7b8  039121b4 libcef!_imp__SymGetSearchPathW
0012f7bc  03678f30 libcef!_sz_dbghelp_dll
0012f7c0  00000001
0012f7c4  038d9de6 libcef!dxva2_NULL_THUNK_DATA_DLN+0x7e
0012f7c8  68d60000
DBGENG:  dbghelp.dll - Partial symbol image load missing image info
DBGHELP: Module is not fully loaded into memory.
DBGHELP: Searching for symbols using debugger-provided data.
DBGHELP: e:\workspace\codes\pc2.0\build\release\dbghelp.pdb - file not found
DBGHELP: e:\workspace\codes\pc2.0\build\release\dll\dbghelp.pdb - file not found
DBGHELP: e:\workspace\codes\pc2.0\build\release\symbols\dll\dbghelp.pdb - file not found
DBGHELP: d:\2623\source\chromium\src\out\release\dbghelp.pdb - file not found
DBGHELP: d:\2623\source\chromium\src\out\release\dll\dbghelp.pdb - file not found
DBGHELP: d:\2623\source\chromium\src\out\release\symbols\dll\dbghelp.pdb - file not found
DBGHELP: dbghelp.pdb - file not found
*** WARNING: Unable to verify timestamp for dbghelp.dll
*** ERROR: Module load completed but symbols could not be loaded for dbghelp.dll
DBGHELP: dbghelp - no symbols loaded
 dbghelp
0012f7cc  00000000
0012f7d0  0000007f
0012f7d4  038db314 libcef!dxva2_NULL_THUNK_DATA_DLN+0x15ac
0012f7d8  00000003
0012f7dc  00000000
0012f7e0  0012f890
0012f7e4  0233264b libcef!_tailMerge_dbghelp_dll+0xd
0012f7e8  0012f7b0
0012f7ec  039121b4 libcef!_imp__SymGetSearchPathW
0012f7f0  00000008
0012f7f4  7c9301db ntdll+0x101db
0012f7f8  00642f9e libcef!base::debug::`anonymous namespace'::InitializeSymbols+0x9e [d:\2623_\source\chromium\src\base\debug\stack_trace_win.cc @ 80]
0012f7fc  ffffffff
0012f800  0017dbe0
0012f804  00000400
0012f808  00000006
0012f80c  00000000
0012f810  00000000
0012f814  00000000
0012f818  09193a78
0012f81c  0000037b
0012f820  00000128
0012f824  00000001
0012f828  77d193e9
SymGetSearchPathW函数找不到所致,文件为dbghelp.dll
使用更新后的dbghelp.dll替换后正常
posted @ 2017-09-20 11:12 ccsdu2009 阅读(90) | 评论 (0)编辑 收藏

2017年9月7日

这里以别人下载好的cef2623版本来编译(默认支持mp3/h64)
网盘地址: https://pan.baidu.com/s/1jHY4hls
编译先决条件:win64系统,安装python2.7 Virtual Studio2013 硬盘空间大于54G以上
下载完成后解压这里解压到D盘下的2623目录
打开CMD窗口执行以下操作以设定环境变量
Set
DEPOT_TOOLS_WIN_TOOLCHAIN=0
Set
CEF_USE_GN=0
Set
GYP_MSVS_VERSION=2013
Set GYP_GENERATORS=ninja,msvs-ninja
然后执行
python
automate-git.py --download-dir=e:\cef3\source --branch=2623 --no-update
--build-log-file --verbose-build --force-distrib --force-build
大致等待5个小时即可编译完成
注意,这个指定—no-update 不更新代码,如果不需要编译debug版本,则需要指定
—no-debug-build
输出目录在src\cef\binary_distrib下
Cefclient.exe为demo程序,点击并输入www.html5test.com可查看支持音视频的情况
当前编译好的2623对音视频的支持如下:
音视频的支持有2处需要修改分别是
1是在source/chromium/src/cef/cef.gypi文件在variables节点下增加
'proprietary_codecs': 1,'ffmpeg_branding': 'Chrome',
2是修改
source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h
和source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h
在宏FFMPEG_CONFIGURATION 中增加
–enable-decoder=’rv10,rv20,rv30,rv40,cook,h263,h263i,mpeg4,msmpeg4v1,msmpeg4v2,msmpeg4v3,amrnb,amrwb,ac3,flv’
–enable-demuxer=’rm,mpegvideo,avi,avisynth,h263,aac,amr,ac3,flv,mpegts,mpegtsraw’
–enable-parser=’mpegvideo,rv30,rv40,h263,mpeg4video,ac3
可以根据需要修改要支持的音视频情况
posted @ 2017-09-07 15:17 ccsdu2009 阅读(15) | 评论 (0)编辑 收藏

2017年5月15日

     摘要: QCustomPlot和QWt各有千秋前者偏轻,但是功能有点弱了,可以修改QCustomPlot增加Qwt的一些模块和类如下 代码为QComstomPlot使用QwtText的例子Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->class Q...  阅读全文
posted @ 2017-05-15 13:16 ccsdu2009 阅读(720) | 评论 (0)编辑 收藏

2017年5月6日

class HTMLLayer : public  QCPLayerable
{
    Q_OBJECT
public:
    HTMLLayer(QCustomPlot
* plot);
    
~HTMLLayer();
public:
    QString layerName()
const;
    
void setVisible(bool visible);

    
void setHTML(const QString& html);
    
void setPen(const QPen& pen);
    
void setFont(const QFont& font);
protected:
    
virtual void applyDefaultAntialiasingHint(QCPPainter* painter)const;
    
virtual void draw(QCPPainter* painter);
private:
    QPen mPen;
    QFont mFont;
    QTextDocument mDocument;
};



HTMLLayer::HTMLLayer(QCustomPlot* plot):
QCPLayerable(plot)
{
}

void HTMLLayer::setHTML(const QString& html)
{
    mDocument.setHtml(html);
}

HTMLLayer::~HTMLLayer()
{
}

QString HTMLLayer::layerName()const
{
    return "HtmlLayer";
}

void HTMLLayer::setVisible(bool visible)
{
    QCPLayer* layer = mParentPlot->layer(layerName());
    if(layer)
    {
        layer->setVisible(visible);
    }    
}

void HTMLLayer::setPen(const QPen& pen)
{
    mPen = pen;
}

void HTMLLayer::setFont(const QFont& font)
{
    mFont = font;
}

void HTMLLayer::applyDefaultAntialiasingHint(QCPPainter* painter)const
{
}

void HTMLLayer::draw(QCPPainter* painter)
{
    painter->save();
    QRectF rect = mParentPlot->rect();
    painter->setPen(mPen);
    painter->setFont(mFont);
    painter->setAntialiasing(true);
    QwtPainter::drawSimpleRichText(painter,rect,Qt::AlignLeft | Qt::AlignTop,mDocument);
    painter->restore();
}

void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect,
    int flags, const QTextDocument &text )
{
    QTextDocument *txt = text.clone();

    painter->save();

    painter->setFont( txt->defaultFont() );
    qwtUnscaleFont( painter );

    txt->setDefaultFont( painter->font() );
    txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) );

    QAbstractTextDocumentLayout* layout = txt->documentLayout();

    const double height = layout->documentSize().height();
    double y = rect.y();
    if ( flags & Qt::AlignBottom )
        y += ( rect.height() - height );
    else if ( flags & Qt::AlignVCenter )
        y += ( rect.height() - height ) / 2;

    QAbstractTextDocumentLayout::PaintContext context;
    context.palette.setColor( QPalette::Text, painter->pen().color() );

    painter->translate( rect.x(), y );
    layout->draw( painter, context );

    painter->restore();
    delete txt;
}

posted @ 2017-05-06 11:11 ccsdu2009 阅读(703) | 评论 (0)编辑 收藏

2017年4月27日

void toString(QString& buffer)
{
    QRegExp rx(
"(\\\\u[0-9a-fA-F]{4})");
    
int pos = 0;
    
while ((pos = rx.indexIn(buffer, pos)) != -1) {
        buffer.replace(pos
++6, QChar(rx.cap(1).right(4).toUShort(016)));
    }
}
posted @ 2017-04-27 19:52 ccsdu2009 阅读(85) | 评论 (0)编辑 收藏

2017年4月1日

class KDJ:
    history 
= []
    code 
= ''
    min 
= 99999.99
    max 
= 0.0
    k 
= 0.0
    d 
= 0.0
    rsv 
= 0.0

    
def __init__(self,code):
        self.code 
= code

    
def checkMinAndMax(self,n):
        min 
= 99999.9
        max 
= 0.0
        
for item in self.history:
            
if item[3< min:
                min 
= item[3]
            
if item[4> max:
                max 
= item[4]
        
return [min,max]

    
def update(self,date,start,close,low,high,n):
        self.history.append([date,start,close,low,high])
        
if len(self.history) < n:
            self.min 
= min(self.min,low)
            self.max 
= max(self.max,high)

            
return [date,self.k,self.d,0,start,close,low,high]
        
else:
            
if len(self.history) > n:
                
del self.history[0]
            
            p 
= self.checkMinAndMax(n)
            
            rsv 
= (close - p[0])/(p[1]-p[0])*100.0

            oldk 
= self.k
            oldd 
= self.d

            self.k 
= (rsv + 2*oldk)/3.0
            self.d 
= (self.k + 2*oldd)/3.0

            self.k 
= min(100,max(self.k,0))
            self.d 
= min(100,max(self.d,0))
            j 
= 3*self.k - 2*self.d
            j 
= min(100,max(j,0))

            
return [date,self.k,self.d,j,start,close,low,high]
posted @ 2017-04-01 14:57 ccsdu2009 阅读(997) | 评论 (0)编辑 收藏

2017年3月29日

常规无法做到,使用setCellWidget(i,j,new QLabel(text));即可
posted @ 2017-03-29 21:00 ccsdu2009 阅读(623) | 评论 (0)编辑 收藏
 
setAlternatingRowColors ( bool enable );
posted @ 2017-03-29 13:34 ccsdu2009 阅读(99) | 评论 (0)编辑 收藏

2017年3月26日

以前还真没用到过
#include <iostream>
#include 
<algorithm>
#include 
<vector>
#include 
<queue>

using namespace std;

int main()
{
    
int arr[] = {2,3,4,5,8,2,9};
    std::priority_queue
<int> data(arr,arr+7);
    std::cout
<<"count:"<<data.size()<<std::endl;

    
while(!data.empty())
    {
        std::cout
<<data.top()<<" ";
        data.pop();
    }
    
return 0;
}
posted @ 2017-03-26 10:30 ccsdu2009 阅读(55) | 评论 (0)编辑 收藏
 
#include <iostream>
#include 
<algorithm>

using namespace std;

template
<class I,class F>
get(I from,I to,F f)
{
    I ret 
= to;
    std::sort(from,to,f);
    
while(from != to)
    {
        
if(*from != *(from+1))
        {
            ret 
= from+1;
            
break;
        }
        from 
++;
    }
    
return ret;
}

template
<class T>
bool isLessThen(T a,T b)
{
    
return a < b;
}

int main()
{
    
int arr[] = {2,3,4,5,8,2,9};
    
int* itr = get(arr,arr+7,isLessThen<int>);
    cout 
<<*itr<< endl;
    
return 0;
}
posted @ 2017-03-26 09:43 ccsdu2009 阅读(53) | 评论 (0)编辑 收藏
仅列出标题  下一页