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 阅读(4366) | 评论 (2)编辑 收藏

2017年9月30日

Libcefwenjianjia文件夹比较简单

分别是浏览器,基础类,渲染类以及打印输出(utility)相关

Chromium下的目录结构很多,可分为几类:编译相关,实验性工程相关,谷歌浏览器相关,专有库相关,代码相关


l  Android_webview Android上的webview控件

l  Apps Chrome程序相关

l  Ash插件相关

l  Base 提供公共的功能代码

l  Blimp 支持裁剪Chrome的谷歌实验性项目

l  Blink 没用

l  Breakpad开源崩溃报告项目

l  Build 构建配置

l  BuildTools 同上

l  Cc 谷歌合成器(chromium compositor)实现部分 涉及帧/层的渲染布局以及图形合成

l  Cef ChromeCef封装

l  Chrome 谷歌浏览器程序核心代码

l  Chrome_elf 错误崩溃报告动态链接库实现

l  ChromeCast Chrome广播相关

l  ChromeOS

l  Clound_Print 谷歌云打印相关 提供谷歌浏览器页面预览打印清单

l  Components 浏览器基础组建目录和资源,比如关于界面资源和UICrash页面显示资源和界面等

l  Content 多进程沙盒浏览器核心代码

l  Courgetter 谷歌提供的二进制文件对比核心算法,在谷歌浏览器中用于比较不同版本的二进制差异

l  Cryto 加密库

l  Dbus 数据总线相关

l  Device 提供辅助设备相关支持 ,涉及蓝牙,电池,NFCUSB

l  Docs

l  Extensions 一个可复用的模块,目前用于扩展Chrome浏览器

l  Gin V8相关的便利类,提供字典,数字缓存等功能

l  Google APIS

l  Google update

l  GPU  涉及blink,gl,ipc

l  Headless提供无头浏览器模式 用于爬虫,自动化测试等

l  Infra 未知

l  IOS IOS系统相关

l  IPC 跨进程通信相关

l  Jingle P2P传输库

l  Mandoline 一个基于Mojo脚本构建Chrome的实验性库

l  Mash ?

l  Media Chrome的多媒体模块,支持音频播放和录音等功能

l  Mojo  支持多类型的沙盒内容

l  Native Client /Natice Client SDK支持在浏览器中执行多脚本语言而不限于js

l  Net 网络功能库

l  Pdf PDF格式相关

PPAPI Chrome扩展插件框架

Printing 打印相关

Remoting 远程控制和调试相关

Rlz库 用于统计软件产品分发和市场使用统计相关

SandBox 沙盒

Sdch 一种压缩格式

Skia Skia图像库目前用于Chrome和Android

Sql sqlite封装库

Storage 数据储存

StyleGuide Chrome 代码风格指南

Sync Chrome账号多数据同步

Testing

Third party 第三方库集合

Tools Chrome工具集

UI Chrome UI

URL 网页链接解析相关

V8 V8 js

Win8 在windows上使chrome以metro模式展现


posted @ 2017-09-30 14:26 ccsdu2009 阅读(40) | 评论 (0)编辑 收藏

2017年9月29日

目前使用Cef框架的软件很多,除了我们的程序,还有网易云音乐,StartUML,通信达等都基于Cef框架。阅读Cef/Chrome底层代码有助于了解他的设计架构和细节,可以帮助我们解决一些Cef框架层面的故障,同时可以学习他的编程思想和框架结构提高编程能力。本文主要介绍Cef3和Chromium,涉及Cef3/Chromium编译,代码目录结构和具体功能实现细节,会根据需要不断完善。需要指出的是Cef3/Chrome版本之间代码框架,文件位置变动很多,如无特殊说明,本文以2623分支为基准。.

一 Cef3/Chromium的编译和音视频支持的修改
先说一点,国内从官网下载源码网络很不稳定,这里以别人下载好的cef2623版本来编译
网盘地址: 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=d:\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-29 13:42 ccsdu2009 阅读(368) | 评论 (0)编辑 收藏

2017年9月23日

def psar(barsdata, iaf = 0.02, maxaf = 0.2):
    length 
= len(barsdata)
    dates 
= list(barsdata['Date'])
    high 
= list(barsdata['High'])
    low 
= list(barsdata['Low'])
    close 
= list(barsdata['Close'])
    psar 
= close[0:len(close)]
    psarbull 
= [None] * length
    psarbear 
= [None] * length
    bull 
= True
    af 
= iaf
    ep 
= low[0]
    hp 
= high[0]
    lp 
= low[0]
    
    
for i in range(2,length):
        
if bull:
            psar[i] 
= psar[i - 1+ af * (hp - psar[i - 1])
        
else:
            psar[i] 
= psar[i - 1+ af * (lp - psar[i - 1])
        
        reverse 
= False
        
        
if bull:
            
if low[i] < psar[i]:
                bull 
= False
                reverse 
= True
                psar[i] 
= hp
                lp 
= low[i]
                af 
= iaf
        
else:
            
if high[i] > psar[i]:
                bull 
= True
                reverse 
= True
                psar[i] 
= lp
                hp 
= high[i]
                af 
= iaf
    
        
if not reverse:
            
if bull:
                
if high[i] > hp:
                    hp 
= high[i]
                    af 
= min(af + iaf, maxaf)
                
if low[i - 1< psar[i]:
                    psar[i] 
= low[i - 1]
                
if low[i - 2< psar[i]:
                    psar[i] 
= low[i - 2]
            
else:
                
if low[i] < lp:
                    lp 
= low[i]
                    af 
= min(af + iaf, maxaf)
                
if high[i - 1> psar[i]:
                    psar[i] 
= high[i - 1]
                
if high[i - 2> psar[i]:
                    psar[i] 
= high[i - 2]
                    
        
if bull:
            psarbull[i] 
= psar[i]
        
else:
            psarbear[i] 
= psar[i]
 
    
return {"dates":dates, "high":high, "low":low, "close":close, "psar":psar, "psarbear":psarbear, "psarbull":psarbull}

这段代码有点问题 需要修改下才能使用
posted @ 2017-09-23 20:56 ccsdu2009 阅读(261) | 评论 (0)编辑 收藏

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 阅读(355) | 评论 (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 阅读(128) | 评论 (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 阅读(857) | 评论 (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 阅读(750) | 评论 (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 阅读(112) | 评论 (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 
=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 阅读(1039) | 评论 (0)编辑 收藏

2017年3月29日

常规无法做到,使用setCellWidget(i,j,new QLabel(text));即可
posted @ 2017-03-29 21:00 ccsdu2009 阅读(651) | 评论 (0)编辑 收藏
仅列出标题  下一页