\r
#include "..\..\StdAfx.h"\r
\r
-#ifndef DISABLE_BLUEFISH\r
-\r
#include "bluefish_consumer.h"\r
#include "util.h"\r
#include "memory.h"\r
\r
#include <memory>\r
\r
+#include <Windows.h>\r
+\r
namespace caspar { namespace core { namespace bluefish {\r
\r
+class BlueVelvetLib\r
+{\r
+ HINSTANCE lib_;\r
+\r
+ BlueVelvetLib()\r
+ { \r
+#ifdef _DEBUG\r
+ auto lib_str = L"BlueVelvet3_d.dll";\r
+#else\r
+ auto lib_str = L"BlueVelvet3.dll";\r
+#endif\r
+ lib_ = LoadLibrary(lib_str); \r
+ if(!lib_)\r
+ BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueVelvet3.dll"));\r
+ BlueVelvetFactory4 = (BlueVelvetFactory4Func)GetProcAddress(lib_, "BlueVelvetFactory4");\r
+ }\r
+public:\r
+ typedef CBlueVelvet4* (*BlueVelvetFactory4Func)();\r
+ BlueVelvetFactory4Func BlueVelvetFactory4;\r
+ \r
+ ~BlueVelvetLib(){FreeLibrary(lib_);}\r
+\r
+ static BlueVelvetLib& get_instance()\r
+ {\r
+ static BlueVelvetLib instance;\r
+ return instance;\r
+ }\r
+};\r
+ \r
+class BlueHancUtilLib\r
+{\r
+ HINSTANCE lib_;\r
+ BlueHancUtilLib()\r
+ { \r
+#ifdef _DEBUG\r
+ auto lib_str = L"BlueHancUtils_d.dll";\r
+#else\r
+ auto lib_str = L"BlueHancUtils.dll";\r
+#endif\r
+ lib_ = LoadLibrary(lib_str); \r
+ if(!lib_)\r
+ BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueHancUtils.dll"));\r
+ encode_hanc_frame = (encode_hanc_frame_func)GetProcAddress(lib_, "encode_hanc_frame");\r
+ encode_hanc_frame_ex = (encode_hanc_frame_ex_func)GetProcAddress(lib_, "encode_hanc_frame_ex");\r
+ }\r
+public:\r
+ typedef BLUE_UINT32 (*encode_hanc_frame_func)(struct hanc_stream_info_struct * hanc_stream_ptr, void * audio_pcm_ptr,BLUE_UINT32 no_audio_ch,BLUE_UINT32 no_audio_samples,BLUE_UINT32 nTypeOfSample,BLUE_UINT32 emb_audio_flag);\r
+ encode_hanc_frame_func encode_hanc_frame;\r
+\r
+ typedef BLUE_UINT32 (*encode_hanc_frame_ex_func)(BLUE_UINT32 card_type, struct hanc_stream_info_struct * hanc_stream_ptr, void * audio_pcm_ptr, BLUE_UINT32 no_audio_ch, BLUE_UINT32 no_audio_samples, BLUE_UINT32 nTypeOfSample, BLUE_UINT32 emb_audio_flag);\r
+ encode_hanc_frame_ex_func encode_hanc_frame_ex;\r
+\r
+ ~BlueHancUtilLib(){FreeLibrary(lib_);}\r
+\r
+ static BlueHancUtilLib& get_instance()\r
+ {\r
+ static BlueHancUtilLib instance;\r
+ return instance;\r
+ }\r
+};\r
+\r
struct consumer::implementation : boost::noncopyable\r
{\r
boost::unique_future<void> active_;\r
executor executor_;\r
\r
- std::shared_ptr<CBlueVelvet4> sdk_;\r
+ std::shared_ptr<CBlueVelvet4> blue_;\r
\r
unsigned int device_index_;\r
video_format_desc format_desc_;\r
\r
public:\r
implementation::implementation(const video_format_desc& format_desc, unsigned int device_index, bool embed_audio) \r
- : sdk_(BlueVelvetFactory4())\r
+ : blue_(BlueVelvetLib::get_instance().BlueVelvetFactory4())\r
, device_index_(device_index)\r
, format_desc_(format_desc)\r
, mem_fmt_(MEM_FMT_ARGB_PC)\r
, embed_audio_(embed_audio)\r
{\r
\r
- if(BLUE_FAIL(sdk_->device_attach(device_index_, FALSE))) \r
+ if(BLUE_FAIL(blue_->device_attach(device_index_, FALSE))) \r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to attach device."));\r
\r
- int videoCardType = sdk_->has_video_cardtype();\r
+ int videoCardType = blue_->has_video_cardtype();\r
CASPAR_LOG(info) << TEXT("BLUECARD INFO: Card type: ") << get_card_desc(videoCardType) << TEXT(". (device ") << device_index_ << TEXT(")");\r
\r
//void* pBlueDevice = blue_attach_to_device(1);\r
//blue_detach_from_device(&pBlueDevice);\r
\r
auto desiredVideoFormat = vid_fmt_from_video_format(format_desc_.format);\r
- int videoModeCount = sdk_->count_video_mode();\r
+ int videoModeCount = blue_->count_video_mode();\r
for(int videoModeIndex = 1; videoModeIndex <= videoModeCount; ++videoModeIndex) \r
{\r
- EVideoMode videoMode = sdk_->enum_video_mode(videoModeIndex);\r
+ EVideoMode videoMode = blue_->enum_video_mode(videoModeIndex);\r
if(videoMode == desiredVideoFormat) \r
vid_fmt_ = videoMode; \r
}\r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to set videomode."));\r
\r
// Set default video output channel\r
- //if(BLUE_FAIL(set_card_property(sdk_, DEFAULT_VIDEO_OUTPUT_CHANNEL, channel)))\r
+ //if(BLUE_FAIL(set_card_property(blue_, DEFAULT_VIDEO_OUTPUT_CHANNEL, channel)))\r
// CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to set default channel. (device ") << device_index_ << TEXT(")");\r
\r
//Setting output Video mode\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_MODE, vid_fmt_))) \r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_MODE, vid_fmt_))) \r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to set videomode."));\r
\r
//Select Update Mode for output\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_UPDATE_TYPE, upd_fmt_))) \r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_UPDATE_TYPE, upd_fmt_))) \r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to set update type. "));\r
\r
disable_video_output();\r
\r
//Enable dual link output\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_DUAL_LINK_OUTPUT, 1)))\r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_DUAL_LINK_OUTPUT, 1)))\r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to enable dual link."));\r
\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_DUAL_LINK_OUTPUT_SIGNAL_FORMAT_TYPE, Signal_FormatType_4224)))\r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_DUAL_LINK_OUTPUT_SIGNAL_FORMAT_TYPE, Signal_FormatType_4224)))\r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to set dual link format type to 4:2:2:4. (device " + boost::lexical_cast<std::string>(device_index_) + ")"));\r
\r
//Select output memory format\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_MEMORY_FORMAT, mem_fmt_))) \r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_MEMORY_FORMAT, mem_fmt_))) \r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to set memory format."));\r
\r
//Select image orientation\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_IMAGE_ORIENTATION, ImageOrientation_Normal)))\r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_IMAGE_ORIENTATION, ImageOrientation_Normal)))\r
CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to set image orientation to normal. (device ") << device_index_ << TEXT(")"); \r
\r
// Select data range\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_RGB_DATA_RANGE, CGR_RANGE))) \r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_RGB_DATA_RANGE, CGR_RANGE))) \r
CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to set RGB data range to CGR. (device ") << device_index_ << TEXT(")"); \r
\r
- if(BLUE_FAIL(set_card_property(sdk_, VIDEO_PREDEFINED_COLOR_MATRIX, vid_fmt_ == VID_FMT_PAL ? MATRIX_601_CGR : MATRIX_709_CGR)))\r
+ if(BLUE_FAIL(set_card_property(blue_, VIDEO_PREDEFINED_COLOR_MATRIX, vid_fmt_ == VID_FMT_PAL ? MATRIX_601_CGR : MATRIX_709_CGR)))\r
CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to set colormatrix to ") << (vid_fmt_ == VID_FMT_PAL ? TEXT("601 CGR") : TEXT("709 CGR")) << TEXT(". (device ") << device_index_ << TEXT(")");\r
- \r
- //if(BLUE_FAIL(set_card_property(sdk_, EMBEDDED_AUDIO_OUTPUT, 0))) \r
- // CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to enable embedded audio. (device ") << device_index_ << TEXT(")"); \r
- //else \r
- //{\r
- // CASPAR_LOG(info) << TEXT("BLUECARD INFO: Enabled embedded audio. (device ") << device_index_ << TEXT(")");\r
- // hasEmbeddedAudio_ = true;\r
- //}\r
+\r
+ if(!embed_audio_)\r
+ {\r
+ if(BLUE_FAIL(set_card_property(blue_, EMBEDEDDED_AUDIO_OUTPUT, 0))) \r
+ CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to disable embedded audio. (device ") << device_index_ << TEXT(")"); \r
+ CASPAR_LOG(info) << TEXT("BLUECARD INFO: Disabled embedded-audio. device ") << device_index_ << TEXT(")");\r
+ }\r
+ else\r
+ {\r
+ if(BLUE_FAIL(set_card_property(blue_, EMBEDEDDED_AUDIO_OUTPUT, blue_emb_audio_enable | blue_emb_audio_group1_enable))) \r
+ CASPAR_LOG(error) << TEXT("BLUECARD ERROR: Failed to enable embedded audio. (device ") << device_index_ << TEXT(")"); \r
+ CASPAR_LOG(info) << TEXT("BLUECARD INFO: Enabled embedded-audio. device ") << device_index_ << TEXT(")");\r
+ }\r
\r
CASPAR_LOG(info) << TEXT("BLUECARD INFO: Successfully configured bluecard for ") << format_desc_ << TEXT(". (device ") << device_index_ << TEXT(")");\r
\r
- if (sdk_->has_output_key()) \r
+ if (blue_->has_output_key()) \r
{\r
int dummy = TRUE; int v4444 = FALSE; int invert = FALSE; int white = FALSE;\r
- sdk_->set_output_key(dummy, v4444, invert, white);\r
+ blue_->set_output_key(dummy, v4444, invert, white);\r
}\r
\r
- if(sdk_->GetHDCardType(device_index_) != CRD_HD_INVALID) \r
- sdk_->Set_DownConverterSignalType(vid_fmt_ == VID_FMT_PAL ? SD_SDI : HD_SDI); \r
+ if(blue_->GetHDCardType(device_index_) != CRD_HD_INVALID) \r
+ blue_->Set_DownConverterSignalType(vid_fmt_ == VID_FMT_PAL ? SD_SDI : HD_SDI); \r
\r
- if(BLUE_FAIL(sdk_->set_video_engine(engine_mode_)))\r
+ if(BLUE_FAIL(blue_->set_video_engine(engine_mode_)))\r
BOOST_THROW_EXCEPTION(bluefish_exception() << msg_info("BLUECARD ERROR: Failed to set vido engine."));\r
\r
enable_video_output();\r
{\r
disable_video_output();\r
\r
- if(sdk_)\r
- sdk_->device_detach(); \r
+ if(blue_)\r
+ blue_->device_detach(); \r
\r
CASPAR_LOG(info) << "BLUECARD INFO: Successfully released device " << device_index_;\r
}\r
\r
void enable_video_output()\r
{\r
- if(!BLUE_PASS(set_card_property(sdk_, VIDEO_BLACKGENERATOR, 0)))\r
+ if(!BLUE_PASS(set_card_property(blue_, VIDEO_BLACKGENERATOR, 0)))\r
CASPAR_LOG(error) << "BLUECARD ERROR: Failed to disable video output. (device " << device_index_ << TEXT(")"); \r
}\r
\r
void disable_video_output()\r
{\r
- if(!BLUE_PASS(set_card_property(sdk_, VIDEO_BLACKGENERATOR, 1)))\r
+ if(!BLUE_PASS(set_card_property(blue_, VIDEO_BLACKGENERATOR, 1)))\r
CASPAR_LOG(error) << "BLUECARD ERROR: Failed to disable video output. (device " << device_index_ << TEXT(")"); \r
}\r
\r
std::copy_n(frame->image_data().begin(), frame->image_data().size(), reserved_frames_.front()->image_data());\r
\r
unsigned long n_field = 0;\r
- sdk_->wait_output_video_synch(UPD_FMT_FRAME, n_field);\r
+ blue_->wait_output_video_synch(UPD_FMT_FRAME, n_field);\r
\r
if(embed_audio_)\r
{ \r
\r
encode_hanc(reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()), frame_audio_data, audio_samples, audio_nchannels);\r
\r
- sdk_->system_buffer_write_async(const_cast<unsigned char*>(reserved_frames_.front()->image_data()), \r
+ blue_->system_buffer_write_async(const_cast<unsigned char*>(reserved_frames_.front()->image_data()), \r
reserved_frames_.front()->image_size(), \r
nullptr, \r
BlueImage_HANC_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_IMAGE));\r
\r
- sdk_->system_buffer_write_async(reserved_frames_.front()->hanc_data(),\r
+ blue_->system_buffer_write_async(reserved_frames_.front()->hanc_data(),\r
reserved_frames_.front()->hanc_size(), \r
nullptr, \r
BlueImage_HANC_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_HANC));\r
\r
- if(BLUE_FAIL(sdk_->render_buffer_update(BlueBuffer_Image_HANC(reserved_frames_.front()->id()))))\r
+ if(BLUE_FAIL(blue_->render_buffer_update(BlueBuffer_Image_HANC(reserved_frames_.front()->id()))))\r
CASPAR_LOG(trace) << TEXT("BLUEFISH: render_buffer_update failed");\r
}\r
else\r
{\r
- sdk_->system_buffer_write_async(const_cast<unsigned char*>(reserved_frames_.front()->image_data()),\r
+ blue_->system_buffer_write_async(const_cast<unsigned char*>(reserved_frames_.front()->image_data()),\r
reserved_frames_.front()->image_size(), \r
nullptr, \r
BlueImage_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_IMAGE));\r
\r
- if(BLUE_FAIL(sdk_->render_buffer_update(BlueBuffer_Image(reserved_frames_.front()->id()))))\r
+ if(BLUE_FAIL(blue_->render_buffer_update(BlueBuffer_Image(reserved_frames_.front()->id()))))\r
CASPAR_LOG(trace) << TEXT("BLUEFISH: render_buffer_update failed");\r
}\r
\r
\r
void encode_hanc(BLUE_UINT32* hanc_data, void* audio_data, size_t audio_samples, size_t audio_nchannels)\r
{ \r
- auto card_type = sdk_->has_video_cardtype();\r
+ auto card_type = blue_->has_video_cardtype();\r
auto sample_type = (AUDIO_CHANNEL_16BIT | AUDIO_CHANNEL_LITTLEENDIAN);\r
\r
hanc_stream_info_struct hanc_stream_info;\r
auto emb_audio_flag = (blue_emb_audio_enable | blue_emb_audio_group1_enable);\r
\r
if (!is_epoch_card(card_type))\r
- {\r
- encode_hanc_frame(&hanc_stream_info, audio_data, audio_nchannels, \r
- audio_samples, sample_type, emb_audio_flag); \r
- }\r
+ BlueHancUtilLib::get_instance().encode_hanc_frame(&hanc_stream_info, audio_data, audio_nchannels, audio_samples, sample_type, emb_audio_flag); \r
else\r
- {\r
- encode_hanc_frame_ex(card_type, &hanc_stream_info, audio_data, audio_nchannels,\r
- audio_samples, sample_type, emb_audio_flag);\r
- } \r
+ BlueHancUtilLib::get_instance().encode_hanc_frame_ex(card_type, &hanc_stream_info, audio_data, audio_nchannels, audio_samples, sample_type, emb_audio_flag);\r
}\r
};\r
\r
consumer::consumer(const video_format_desc& format_desc, unsigned int device_index, bool embed_audio) : impl_(new implementation(format_desc, device_index, embed_audio)){} \r
void consumer::send(const safe_ptr<const read_frame>& frame){impl_->send(frame);}\r
size_t consumer::buffer_depth() const{return impl_->buffer_depth();}\r
-}}}\r
-\r
-#endif
\ No newline at end of file
+}}}
\ No newline at end of file