diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mpc/audio_stream_mpc.cpp | 2 | ||||
| -rw-r--r-- | drivers/openssl/stream_peer_ssl.cpp | 111 | ||||
| -rw-r--r-- | drivers/openssl/stream_peer_ssl.h | 26 | ||||
| -rw-r--r-- | drivers/vorbis/audio_stream_ogg_vorbis.cpp | 10 |
4 files changed, 146 insertions, 3 deletions
diff --git a/drivers/mpc/audio_stream_mpc.cpp b/drivers/mpc/audio_stream_mpc.cpp index 91912c8948..e1f9aacf5f 100644 --- a/drivers/mpc/audio_stream_mpc.cpp +++ b/drivers/mpc/audio_stream_mpc.cpp @@ -140,7 +140,7 @@ mpc_bool_t AudioStreamMPC::_mpc_canseek(mpc_reader *p_reader) { bool AudioStreamMPC::_can_mix() const { - return active && !paused; + return /*active &&*/ !paused; } diff --git a/drivers/openssl/stream_peer_ssl.cpp b/drivers/openssl/stream_peer_ssl.cpp new file mode 100644 index 0000000000..aaedd7dde9 --- /dev/null +++ b/drivers/openssl/stream_peer_ssl.cpp @@ -0,0 +1,111 @@ +#include "stream_peer_ssl.h" + + +int StreamPeerSSL::bio_create( BIO *b ) { + b->init = 1; + b->num = 0; + b->ptr = NULL; + b->flags = 0; + return 1; +} + +int StreamPeerSSL::bio_destroy( BIO *b ) { + + if ( b == NULL ) return 0; + b->ptr = NULL; /* sb_tls_remove() will free it */ + b->init = 0; + b->flags = 0; + return 1; +} + +int StreamPeerSSL::bio_read( BIO *b, char *buf, int len ) { + + if ( buf == NULL || len <= 0 ) return 0; + + StreamPeerSSL * sp = (StreamPeerSSL*)b->ptr; + + if (sp->base.is_null()) + return 0; + + + + BIO_clear_retry_flags( b ); + + Error err; + int ret=0; + if (sp->block) { + err = sp->base->get_data((const uint8_t*)buf,len); + if (err==OK) + ret=len; + } else { + + err = sp->base->get_partial_data((const uint8_t*)buf,len,ret); + if (err==OK && ret!=len) { + BIO_set_retry_write( b ); + } + + } + + return ret; +} + +int StreamPeerSSL::bio_write( BIO *b, const char *buf, int len ) { + + if ( buf == NULL || len <= 0 ) return 0; + + StreamPeerSSL * sp = (StreamPeerSSL*)b->ptr; + + if (sp->base.is_null()) + return 0; + + BIO_clear_retry_flags( b ); + + Error err; + int wrote=0; + if (sp->block) { + err = sp->base->put_data((const uint8_t*)buf,len); + if (err==OK) + wrote=len; + } else { + + err = sp->base->put_partial_data((const uint8_t*)buf,len,wrote); + if (err==OK && wrote!=len) { + BIO_set_retry_write( b ); + } + + } + + return wrote; +} + +long StreamPeerSSL::bio_ctrl( BIO *b, int cmd, long num, void *ptr ) { + if ( cmd == BIO_CTRL_FLUSH ) { + /* The OpenSSL library needs this */ + return 1; + } + return 0; +} + +int StreamPeerSSL::bio_gets( BIO *b, char *buf, int len ) { + return -1; +} + +int StreamPeerSSL::bio_puts( BIO *b, const char *str ) { + return StreamPeerSSL::bio_write( b, str, strlen( str ) ); +} + +BIO_METHOD StreamPeerSSL::bio_methods = +{ + ( 100 | 0x400 ), /* it's a source/sink BIO */ + "sockbuf glue", + StreamPeerSSL::bio_write, + StreamPeerSSL::bio_read, + StreamPeerSSL::bio_puts, + StreamPeerSSL::bio_gets, + StreamPeerSSL::bio_ctrl, + StreamPeerSSL::bio_create, + StreamPeerSSL::bio_destroy +}; + +StreamPeerSSL::StreamPeerSSL() { +} diff --git a/drivers/openssl/stream_peer_ssl.h b/drivers/openssl/stream_peer_ssl.h new file mode 100644 index 0000000000..a126f6122c --- /dev/null +++ b/drivers/openssl/stream_peer_ssl.h @@ -0,0 +1,26 @@ +#ifndef STREAM_PEER_SSL_H +#define STREAM_PEER_SSL_H + +#include "io/stream_peer.h" + +class StreamPeerSSL : public StreamPeer { + + OBJ_TYPE(StreamPeerSSL,StreamPeer); + + Ref<StreamPeer> base; + bool block; + static BIO_METHOD bio_methods; + + static int bio_create( BIO *b ); + static int bio_destroy( BIO *b ); + static int bio_read( BIO *b, char *buf, int len ); + static int bio_write( BIO *b, const char *buf, int len ); + static long bio_ctrl( BIO *b, int cmd, long num, void *ptr ); + static int bio_gets( BIO *b, char *buf, int len ); + static int bio_puts( BIO *b, const char *str ); + +public: + StreamPeerSSL(); +}; + +#endif // STREAM_PEER_SSL_H diff --git a/drivers/vorbis/audio_stream_ogg_vorbis.cpp b/drivers/vorbis/audio_stream_ogg_vorbis.cpp index 0964a22c94..d9b7b1d161 100644 --- a/drivers/vorbis/audio_stream_ogg_vorbis.cpp +++ b/drivers/vorbis/audio_stream_ogg_vorbis.cpp @@ -97,7 +97,7 @@ long AudioStreamOGGVorbis::_ov_tell_func(void *_f) { bool AudioStreamOGGVorbis::_can_mix() const { - return playing && !paused; + return /*playing &&*/ !paused; } @@ -125,6 +125,8 @@ void AudioStreamOGGVorbis::update() { if (ret<0) { playing = false; + setting_up=false; + ERR_EXPLAIN("Error reading OGG Vorbis File: "+file); ERR_BREAK(ret<0); } else if (ret==0) { // end of song, reload? @@ -135,7 +137,8 @@ void AudioStreamOGGVorbis::update() { if (!has_loop()) { - playing=false; + playing=false; + setting_up=false; repeats=1; return; } @@ -145,6 +148,7 @@ void AudioStreamOGGVorbis::update() { int errv = ov_open_callbacks(f,&vf,NULL,0,_ov_callbacks); if (errv!=0) { playing=false; + setting_up=false; return; // :( } @@ -179,6 +183,8 @@ void AudioStreamOGGVorbis::play() { playing=false; setting_up=true; update(); + if (!setting_up) + return; setting_up=false; playing=true; } |