void setup_audio( ) { /* FIXME hard coded default */ n_channels = 2; audio_in_pipe = new Pipe<AudioPacket *>(OUT_PIPE_SIZE); /* FIXME magic 29.97 related number */ /* Set up empty audio packet for prerolling */ current_audio_pkt = new AudioPacket(48000, n_channels, 2, 25626); samples_written_from_current_audio_pkt = 0; assert(deckLinkOutput != NULL); if (deckLinkOutput->SetAudioCallback(this) != S_OK) { throw std::runtime_error( "Failed to set DeckLink audio callback" ); } if (deckLinkOutput->EnableAudioOutput( bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, n_channels, bmdAudioOutputStreamContinuous) != S_OK) { throw std::runtime_error( "Failed to enable DeckLink audio output" ); } audio_preroll_done = 0; if (deckLinkOutput->BeginAudioPreroll( ) != S_OK) { throw std::runtime_error( "Failed to begin DeckLink audio preroll" ); } while (audio_preroll_done == 0) { /* FIXME: busy wait */ } if (deckLinkOutput->EndAudioPreroll( ) != S_OK) { throw std::runtime_error( "Failed to end DeckLink audio preroll" ); } }
void setup_audio( ) { IOAudioPacket preroll_audio(8008, n_channels); preroll_audio.zero( ); audio_in_pipe = new Pipe<IOAudioPacket *>(OUT_PIPE_SIZE); audio_fifo = new AudioFIFO<int16_t>(n_channels); audio_fifo->add_packet(&preroll_audio); assert(deckLinkOutput != NULL); if (deckLinkOutput->SetAudioCallback(this) != S_OK) { throw std::runtime_error( "Failed to set DeckLink audio callback" ); } if (deckLinkOutput->EnableAudioOutput( bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, n_channels, bmdAudioOutputStreamContinuous) != S_OK) { throw std::runtime_error( "Failed to enable DeckLink audio output" ); } audio_preroll_done = 0; if (deckLinkOutput->BeginAudioPreroll( ) != S_OK) { throw std::runtime_error( "Failed to begin DeckLink audio preroll" ); } while (audio_preroll_done == 0) { /* FIXME: busy wait */ } if (deckLinkOutput->EndAudioPreroll( ) != S_OK) { throw std::runtime_error( "Failed to end DeckLink audio preroll" ); } }
bool open( unsigned card = 0 ) { IDeckLinkIterator* deckLinkIterator = CreateDeckLinkIteratorInstance(); unsigned i = 0; if ( !deckLinkIterator ) { mlt_log_verbose( NULL, "The DeckLink drivers not installed.\n" ); return false; } // Connect to the Nth DeckLink instance do { if ( deckLinkIterator->Next( &m_deckLink ) != S_OK ) { mlt_log_verbose( NULL, "DeckLink card not found\n" ); deckLinkIterator->Release(); return false; } } while ( ++i <= card ); // Obtain the audio/video output interface (IDeckLinkOutput) if ( m_deckLink->QueryInterface( IID_IDeckLinkOutput, (void**)&m_deckLinkOutput ) != S_OK ) { mlt_log_verbose( NULL, "No DeckLink cards support output\n" ); m_deckLink->Release(); m_deckLink = 0; deckLinkIterator->Release(); return false; } // Provide this class as a delegate to the audio and video output interfaces m_deckLinkOutput->SetScheduledFrameCompletionCallback( this ); m_deckLinkOutput->SetAudioCallback( this ); pthread_mutex_init( &m_mutex, NULL ); pthread_cond_init( &m_condition, NULL ); m_maxAudioBuffer = bmdAudioSampleRate48kHz; m_videoFrameQ = mlt_deque_init(); return true; }