📄 audiostream.c
字号:
if (pt==NULL){ ms_error("audiostream.c: undefined payload type."); return -1; } stream->encoder=ms_filter_create_encoder(pt->mime_type); stream->decoder=ms_filter_create_decoder(pt->mime_type); if ((stream->encoder==NULL) || (stream->decoder==NULL)){ /* big problem: we have not a registered codec for this payload...*/ ms_error("mediastream.c: No decoder available for payload %i.",payload); return -1; } if (use_ec) { stream->ec=ms_filter_new(MS_SPEEX_EC_ID); ms_filter_call_method(stream->ec,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate); } /* give the sound filters some properties */ ms_filter_call_method(stream->soundread,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate); ms_filter_call_method(stream->soundwrite,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate); tmp=1; ms_filter_call_method(stream->soundwrite,MS_FILTER_SET_NCHANNELS, &tmp); /* give the encoder/decoder some parameters*/ ms_filter_call_method(stream->encoder,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate); if (pt->normal_bitrate>0){ ms_message("Setting audio encoder network bitrate to %i",pt->normal_bitrate); ms_filter_call_method(stream->encoder,MS_FILTER_SET_BITRATE,&pt->normal_bitrate); } ms_filter_call_method(stream->decoder,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate); if (pt->send_fmtp!=NULL) ms_filter_call_method(stream->encoder,MS_FILTER_ADD_FMTP, (void*)pt->send_fmtp); if (pt->recv_fmtp!=NULL) ms_filter_call_method(stream->decoder,MS_FILTER_ADD_FMTP,(void*)pt->recv_fmtp); /* and then connect all */ /* tip: draw yourself the picture if you don't understand */ if (stream->ec){ ms_filter_link(stream->soundread,0,stream->ec,1); ms_filter_link(stream->ec,1,stream->encoder,0); ms_filter_link(stream->dtmfgen,0,stream->ec,0); ms_filter_link(stream->ec,0,stream->soundwrite,0); }else{ ms_filter_link(stream->soundread,0,stream->encoder,0); ms_filter_link(stream->dtmfgen,0,stream->soundwrite,0); } ms_filter_link(stream->encoder,0,stream->rtpsend,0); ms_filter_link(stream->rtprecv,0,stream->decoder,0); ms_filter_link(stream->decoder,0,stream->dtmfgen,0); /* create ticker */ stream->ticker=ms_ticker_new(); ms_ticker_attach(stream->ticker,stream->soundread); ms_ticker_attach(stream->ticker,stream->rtprecv); return 0;}int audio_stream_start_with_files(AudioStream *stream, RtpProfile *prof,const char *remip, int remport, int rem_rtcp_port, int pt,int jitt_comp, const char *infile, const char * outfile){ return audio_stream_start_full(stream,prof,remip,remport,rem_rtcp_port,pt,jitt_comp,infile,outfile,NULL,NULL,FALSE);}AudioStream * audio_stream_start(RtpProfile *prof,int locport,const char *remip,int remport,int profile,int jitt_comp,bool_t use_ec){ MSSndCard *sndcard; AudioStream *stream; sndcard=ms_snd_card_manager_get_default_card(ms_snd_card_manager_get()); if (sndcard==NULL) return NULL; stream=audio_stream_new(locport, ms_is_ipv6(remip)); if (audio_stream_start_full(stream,prof,remip,remport,remport+1,profile,jitt_comp,NULL,NULL,sndcard,sndcard,use_ec)==0) return stream; audio_stream_free(stream); return NULL;}AudioStream *audio_stream_start_with_sndcards(RtpProfile *prof,int locport,const char *remip,int remport,int profile,int jitt_comp,MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec){ AudioStream *stream; if (playcard==NULL) { ms_error("No playback card."); return NULL; } if (captcard==NULL) { ms_error("No capture card."); return NULL; } stream=audio_stream_new(locport, ms_is_ipv6(remip)); if (audio_stream_start_full(stream,prof,remip,remport,remport+1,profile,jitt_comp,NULL,NULL,playcard,captcard,use_ec)==0) return stream; audio_stream_free(stream); return NULL;}void audio_stream_set_rtcp_information(AudioStream *st, const char *cname, const char *tool){ if (st->session!=NULL){ rtp_session_set_source_description(st->session,cname,NULL,NULL,NULL,NULL,tool , "This is free software (GPL) !"); }}void audio_stream_play(AudioStream *st, const char *name){ if (ms_filter_get_id(st->soundread)==MS_FILE_PLAYER_ID){ ms_filter_call_method_noarg(st->soundread,MS_FILE_PLAYER_CLOSE); ms_filter_call_method(st->soundread,MS_FILE_PLAYER_OPEN,(void*)name); ms_filter_call_method_noarg(st->soundread,MS_FILE_PLAYER_START); }else{ ms_error("Cannot play file: the stream hasn't been started with" " audio_stream_start_with_files"); }}void audio_stream_record(AudioStream *st, const char *name){ if (ms_filter_get_id(st->soundwrite)==MS_FILE_REC_ID){ ms_filter_call_method_noarg(st->soundwrite,MS_FILE_REC_CLOSE); ms_filter_call_method(st->soundwrite,MS_FILE_REC_OPEN,(void*)name); ms_filter_call_method_noarg(st->soundwrite,MS_FILE_REC_START); }else{ ms_error("Cannot record file: the stream hasn't been started with" " audio_stream_start_with_files"); }}AudioStream *audio_stream_new(int locport, bool_t ipv6){ AudioStream *stream=(AudioStream *)ms_new0(AudioStream,1); stream->session=create_duplex_rtpsession(locport,ipv6); stream->rtpsend=ms_filter_new(MS_RTP_SEND_ID); return stream;}int audio_stream_start_now(AudioStream *stream, RtpProfile * prof, const char *remip, int remport, int rem_rtcp_port, int payload_type, int jitt_comp, MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec){ return audio_stream_start_full(stream,prof,remip,remport,rem_rtcp_port, payload_type,jitt_comp,NULL,NULL,playcard,captcard,use_ec);}void audio_stream_set_relay_session_id(AudioStream *stream, const char *id){ ms_filter_call_method(stream->rtpsend, MS_RTP_SEND_SET_RELAY_SESSION_ID,(void*)id);}void audio_stream_stop(AudioStream * stream){ if (stream->ticker){ ms_ticker_detach(stream->ticker,stream->soundread); ms_ticker_detach(stream->ticker,stream->rtprecv); rtp_stats_display(rtp_session_get_stats(stream->session),"Audio session's RTP statistics"); if (stream->ec!=NULL){ ms_filter_unlink(stream->soundread,0,stream->ec,1); ms_filter_unlink(stream->ec,1,stream->encoder,0); ms_filter_unlink(stream->dtmfgen,0,stream->ec,0); ms_filter_unlink(stream->ec,0,stream->soundwrite,0); }else{ ms_filter_unlink(stream->soundread,0,stream->encoder,0); ms_filter_unlink(stream->dtmfgen,0,stream->soundwrite,0); } ms_filter_unlink(stream->encoder,0,stream->rtpsend,0); ms_filter_unlink(stream->rtprecv,0,stream->decoder,0); ms_filter_unlink(stream->decoder,0,stream->dtmfgen,0); } audio_stream_free(stream);}RingStream * ring_start(const char *file, int interval, MSSndCard *sndcard){ return ring_start_with_cb(file,interval,sndcard,NULL,NULL);}RingStream * ring_start_with_cb(const char *file,int interval,MSSndCard *sndcard, MSFilterNotifyFunc func,void * user_data){ RingStream *stream; int tmp; stream=(RingStream *)ms_new0(RingStream,1); stream->source=ms_filter_new(MS_FILE_PLAYER_ID); if (ms_filter_call_method(stream->source,MS_FILE_PLAYER_OPEN,(void*)file)<0){ ms_filter_destroy(stream->source); ms_free(stream); return NULL; } ms_filter_call_method(stream->source,MS_FILE_PLAYER_LOOP,&interval); ms_filter_call_method_noarg(stream->source,MS_FILE_PLAYER_START); if (func!=NULL) ms_filter_set_notify_callback(stream->source,func,user_data); stream->sndwrite=ms_snd_card_create_writer(sndcard); ms_filter_call_method(stream->source,MS_FILTER_GET_SAMPLE_RATE,&tmp); ms_filter_call_method(stream->sndwrite,MS_FILTER_SET_SAMPLE_RATE,&tmp); ms_filter_call_method(stream->source,MS_FILTER_GET_NCHANNELS,&tmp); ms_filter_call_method(stream->sndwrite,MS_FILTER_SET_NCHANNELS,&tmp); stream->ticker=ms_ticker_new(); ms_filter_link(stream->source,0,stream->sndwrite,0); ms_ticker_attach(stream->ticker,stream->source); return stream;}void ring_stop(RingStream *stream){ ms_ticker_detach(stream->ticker,stream->source); ms_filter_unlink(stream->source,0,stream->sndwrite,0); ms_ticker_destroy(stream->ticker); ms_filter_destroy(stream->source); ms_filter_destroy(stream->sndwrite); ms_free(stream);}int audio_stream_send_dtmf(AudioStream *stream, char dtmf){ ms_filter_call_method(stream->rtpsend,MS_RTP_SEND_SEND_DTMF,&dtmf); ms_filter_call_method(stream->dtmfgen,MS_DTMF_GEN_PUT,&dtmf); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -