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

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 阅读(611) | 评论 (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 阅读(636) | 评论 (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 阅读(51) | 评论 (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 阅读(951) | 评论 (0)编辑 收藏

2017年3月29日

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

2016年10月16日

QTextCursor cursor = textCursor();
cursor.movePosition(QTextCursor::Start);
setTextCursor(cursor);
posted @ 2016-10-16 10:12 ccsdu2009 阅读(65) | 评论 (0)编辑 收藏

2016年10月9日

如下:
    foreach(QCPAxis* axis,mMacdRect->rangeDragAxes(Qt::Horizontal))
        connect(mCustomPlot->xAxis,SIGNAL(rangeChanged(QCPRange)),axis,SLOT(setRange(QCPRange)));

很简单
posted @ 2016-10-09 11:55 ccsdu2009 阅读(170) | 评论 (0)编辑 收藏
仅列出标题  下一页