@@ -78,6 +78,7 @@ struct set_opts {
78
78
uint8_t mode ;
79
79
int flushable ;
80
80
uint32_t priority ;
81
+ uint16_t voice ;
81
82
};
82
83
83
84
struct connect {
@@ -723,13 +724,14 @@ static int sco_connect(int sock, const bdaddr_t *dst)
723
724
return 0 ;
724
725
}
725
726
726
- static gboolean sco_set (int sock , uint16_t mtu , GError * * err )
727
+ static gboolean sco_set (int sock , uint16_t mtu , uint16_t voice , GError * * err )
727
728
{
728
729
struct sco_options sco_opt ;
730
+ struct bt_voice bt_voice ;
729
731
socklen_t len ;
730
732
731
733
if (!mtu )
732
- return TRUE ;
734
+ goto voice ;
733
735
734
736
len = sizeof (sco_opt );
735
737
memset (& sco_opt , 0 , len );
@@ -745,6 +747,17 @@ static gboolean sco_set(int sock, uint16_t mtu, GError **err)
745
747
return FALSE;
746
748
}
747
749
750
+ voice :
751
+ if (!voice )
752
+ return TRUE;
753
+
754
+ bt_voice .setting = voice ;
755
+ if (setsockopt (sock , SOL_BLUETOOTH , BT_VOICE , & bt_voice ,
756
+ sizeof (bt_voice )) < 0 ) {
757
+ ERROR_FAILED (err , "setsockopt(BT_VOICE)" , errno );
758
+ return FALSE;
759
+ }
760
+
748
761
return TRUE;
749
762
}
750
763
@@ -832,6 +845,9 @@ static gboolean parse_set_opts(struct set_opts *opts, GError **err,
832
845
case BT_IO_OPT_PRIORITY :
833
846
opts -> priority = va_arg (args , int );
834
847
break ;
848
+ case BT_IO_OPT_VOICE :
849
+ opts -> voice = va_arg (args , int );
850
+ break ;
835
851
default :
836
852
g_set_error (err , BT_IO_ERROR , EINVAL ,
837
853
"Unknown option %d" , opt );
@@ -1310,7 +1326,7 @@ gboolean bt_io_set(GIOChannel *io, GError **err, BtIOOption opt1, ...)
1310
1326
case BT_IO_RFCOMM :
1311
1327
return rfcomm_set (sock , opts .sec_level , opts .master , err );
1312
1328
case BT_IO_SCO :
1313
- return sco_set (sock , opts .mtu , err );
1329
+ return sco_set (sock , opts .mtu , opts . voice , err );
1314
1330
default :
1315
1331
g_set_error (err , BT_IO_ERROR , EINVAL ,
1316
1332
"Unknown BtIO type %d" , type );
@@ -1377,7 +1393,7 @@ static GIOChannel *create_io(gboolean server, struct set_opts *opts,
1377
1393
}
1378
1394
if (sco_bind (sock , & opts -> src , err ) < 0 )
1379
1395
goto failed ;
1380
- if (!sco_set (sock , opts -> mtu , err ))
1396
+ if (!sco_set (sock , opts -> mtu , opts -> voice , err ))
1381
1397
goto failed ;
1382
1398
break ;
1383
1399
default :
0 commit comments