带缓冲区的多线程读写数据

//vRecorder.hpp
//vov
#ifndef V_RECORDER_HPP
#define V_RECORDER_HPP

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>

#include "Recorder.h"
#include "vBufferChar.hpp"

class vRecorder
{
    void *handler_;
    std::string config_path_;
    int buffer_size_;
public:
    vRecorder(std::string config_path,int size);
    ~vRecorder();
    bool init();
    bool start();
    bool stop();
    void release();
    int read(char* data,int size);
private:
    std::unique_ptr<vBufferChar> uptr_buffer_;
    std::unique_ptr<std::thread> uptr_thread_record_;
    std::mutex mtx_buf_;
    std::condition_variable cv_buf_;
    std::atomic<bool> flag_record_;

    void thread_record();
};

//public
vRecorder::vRecorder(std::string config_path,int size=16000)
    :handler_(nullptr),
    uptr_buffer_(nullptr),
    uptr_thread_record_(nullptr),
    flag_record_(false)
{
    config_path_=config_path;
    uptr_buffer_.reset(new vBufferChar(size));
}

vRecorder::~vRecorder() {
    if(flag_record_&&uptr_thread_record_) {
        flag_record_=false;
        if(uptr_thread_record_->joinable()) {
            uptr_thread_record_->join();
        }
    }

    if(handler_) {
        Recorder_Release(handler_);
    }
    
    std::cout<<"[vRecorder]"<<__FUNCTION__<<std::endl;
}

bool vRecorder::init() {
    handler_=Recorder_Init(config_path_.data());
    return (!handler_)?false:true;
}

bool vRecorder::start() {
    if(handler_&&!uptr_thread_record_&&!flag_record_) {
        uptr_thread_record_.reset(new std::thread(&vRecorder::thread_record,this));
        flag_record_=(!uptr_thread_record_)?false:true;
    }

    if(handler_&&uptr_thread_record_) {
        flag_record_=true;
    }
    
    return flag_record_;
}

bool vRecorder::stop() {
    if(flag_record_) {
        flag_record_=false;
        if(uptr_thread_record_->joinable()) {
            uptr_thread_record_->join();
        }
    }
    return true;
}

void vRecorder::release() {
    flag_record_=false;
    if(uptr_thread_record_->joinable()) {
        uptr_thread_record_->join();
    }

    std::cout<<"[vRecorder]"<<__FUNCTION__<<std::endl;
}

int vRecorder::read(char*data,int size) {
    if(size<=0) {
        return 0;
    }
    
    int read_size=0;
    {
        std::unique_lock<std::mutex> lock(mtx_buf_);
        cv_buf_.wait(lock,[this]{return uptr_buffer_->size()>0;});
        read_size=uptr_buffer_->read(data,size);
    }
    
    return read_size;
}

//private
void vRecorder::thread_record() {
    while(flag_record_) {
        int16_t *data{nullptr};
        int res=Recorder_Read(handler_,&data);
        if(res>0) {
            {
                std::unique_lock<std::mutex> lock(mtx_buf_);
                uptr_buffer_->write((const char*)data,res<<1);
                cv_buf_.notify_all();
            }
        }
    }
}

#endif

转载于:https://www.cnblogs.com/smallredness/p/10948534.html

V Recorder是一款稳定流畅的屏幕录像机/游戏录像机/录像机,适用于Android,也是一款功能强大的一体化视频编辑器。VideoShow Recorder由VideoShow应用程序团队创建,拥有超过4亿用户。它是世界上500万用户选择的最易于使用的免费屏幕录音机。 VideoShow Recorder允许您在播放时录制游戏,一键捕捉屏幕并使用滤镜,效果,音乐编辑视频。没有水印也没有录制时间限制,您可以使用V Recorder进行高质量的屏幕录制和清晰的截屏,无需生根。 强大的录音: 您可以在录制或捕获屏幕时轻松隐藏无框视频的录制窗口,将宽高比更改为宽屏,垂直或方形。 它是一个稳定的屏幕录像机,可以录制任何应用程序的教程和捕获屏幕视频 只需轻轻一按即可开始录制声音的手机上的所有内容,只需按一下即可暂停/恢复。 简单的界面,在播放时非常容易记录游戏,录制视频通话或现场表演,捕获屏幕截图,记录屏幕和编辑图像。 高品质和自定义设置:1440p分辨率,12.0Mbps质量,60 FPS,支持高清视频,纵向和横向视频方向。您可以随意更改视频设置以满足您的需求,并录制清晰流畅的视频或屏幕截图。 专业视频编辑: 时尚滤镜:我们提供流行的滤镜,如平滑/美白/纤细/女神/自然,让您的视频独一无二。 可爱的贴纸:有趣的贴纸/ GIF /模因/表情符号主题,你可以制作一个流行的视频,简单的步骤rec屏幕。 单调的主题:我们有超过100个精心设计的免费主题,其中包括适合所有场合的圣诞节/马卡龙/珍贵备忘录。 成千上万的完全许可音乐:您可以在线下载音乐或从您的设备添加本地歌曲。您甚至可以录制自己的声音或使用我们的声音效果,如卡通人物/机器人,使您的视频更酷 免费视频编辑器:轻松剪切/合并/修剪/分割/反向/复制/旋转/拼贴/压缩/转换/裁剪您的录制剪辑。 速度控制:使用快动作/慢动作来改变视频速度。随意将背景图片添加到垂直视频或模糊它。 魔术笔刷:触摸屏绘制,涂抹任何你想制作原创视频的东西。您甚至可以模糊图像,像素化图像以覆盖您不想显示的区域。或者将视频转换为GIF,rec屏幕。VideoShow Recorder为您提供最专业的编辑工具来制作热门视频。 什么是新的: 支持自动水平和垂直屏幕录制 更顺畅 破解信息: Vip功能已解锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值