summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mpc/audio_stream_mpc.cpp2
-rw-r--r--drivers/openssl/stream_peer_ssl.cpp111
-rw-r--r--drivers/openssl/stream_peer_ssl.h26
-rw-r--r--drivers/vorbis/audio_stream_ogg_vorbis.cpp10
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;
}