基于QIODevice的环形缓冲

  学习QT快5个月了,终于想写一些东西了,希望大家不要见笑,在写基于 ffmpeg的视频处理中,需要一个缓冲存储音频数据以便于QAudio播放。QAudioOutput支持i从QIODevice读取数据。希望能有一个继承于QIODevice能通过另外一个线程不断的写入数据来不断的播放。于是想到了环形缓冲。能在有限的内存里。实现上诉功能。同时还可用于其他通讯程序。在写之前看了一下QIODevice的源码以及QBuffer的源码。初步了解了QT基本程序框架。

QLoopBuffer.h

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

 

/****************************************************************************
** copy right:lbwave(lbwave@sina.com)
环形缓冲:环形缓冲是在一段连续分配的有限内存空间内,首尾衔接存储数据。环形缓冲有以下几个特点
1、内存分配空间连续,大小固定,便于内存管理。
2、遵循先入先出的原则。及读写的地址指针不受用户控制。而且读写指针分开。
根据上述特点,为了提高环形缓从的数据安全:
1、环形缓冲在使用者看到的是一个存储池。使用者只能向缓冲池注入数据和读出数据。可以获得缓冲池的信息。但不能操作数据。因此在缓冲中随意移动指针是有害的。
2、在环形缓冲中seek函数和pos 是不应该存在的。
3、read函数仅从缓冲头读出数据,并清除出缓冲区。
3、write函数从缓冲尾写入数据。
4、缓冲中重要的数据:usedsize(可读数据大小) buffersize(缓冲池大小)

以下是遵循QT的源代码标准写的环形缓冲类:
1、继承于QIODevice
在QT很多输入输出类都是基于QIODevice的操作。从QIODvice中继承可以方便的用于输入输出操作。
2、支持多线程操作
3、有读写同步操作
4、支持阻塞方式读写


以下环形缓冲类参照了QBuffer.h QBuffer.cpp的写法

QLoopBuffer详解:


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

#ifndef QLoopBuffer_H
#define QLoopBuffer_H

#include <QtCore/qiodevice.h>
#include <QtCore/qbytearray.h>
#include <QtCore/QMutex>
#include <QtCore/QWaitCondition>
#include "private/qiodevice_p.h"
#include <QDebug>

QT_BEGIN_HEADER

QT_BEGIN_NAMESPACE

QT_MODULE(Core)

class QObject;
class QLoopBufferPrivate;

class QLoopBuffer : public QIODevice
{
#ifndef QT_NO_QOBJECT
  Q_OBJECT
#endif<

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值