Приветствую всех!Данная тема относиться к C++ но немножко будет нестадартна тем, что для ее расмотрения нужна звуковая система OSS ( http://developer.opensound.com )
Ближе к делу.
OSS - когда-то проприетарные, сейчас Open Source GPL v.2 звуковые драйвера для всех видов UNIX.
Избрал именно их - ибо единственные в своем роде которые пашут на разных UNIX.
Нужно заполнить контейнер неякими данными.
Проблема в том, что если использовать
std::map<std::string, int> список создаеться нормально.
А вот при std::map<const char*, int> не хочет.
Мне нужно как раз char* и не std::string...
Пробывал заполнять другими данными - без проблем с char* и с std::string.
Какой-то полтергейст. Не понятно почему не хочет именно в моем случае:
Ниже выкладываю текст.
Компилил с использованием OSS v.4 и gcc 4.1.2
Проверял в GNU/Linux, должно работать также и в *BSD.
ВНИМАНИЕ: OSS v.4! OSS < v.4 не подойдет... Там совершенно другой API. Хотя все может быть..
Если нужна помощь в установке самых драйверов в GNU/Linux, FreeBSD - помогу.
/*
Using OSS v.4.0 (b071114/200711211324) GPL license. OSS API v.40003
ICH AC97 Mixer (AD1985)
GCC 4.1.2 GNU/Linux
g++ bug.cpp -o bug
./bug
Creating not correctly list with using std::map<const char*, int>
Only work with std::map<std::string, int>
Two part of this file (working and not working) are identicaly, with once defference:
Not working: std::map<const char*, int>
Working: std::map<std::string, int>
Author: Alex J. Ivasyuv // SIEGERSTEIN
Bug version under GPL, working under proprietary :)) // joke
*/
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sys/ioctl.h>
#include <fcntl.h>
#include "/usr/lib/oss/include/sys/soundcard.h"
int mixer_fd = -1;
int mixer_dev = 0;
int nrext = -1;
oss_mixext ext;
int main() {
if ((mixer_fd = open("/dev/mixer", O_RDWR)) == -1) {
perror ("/dev/mixer");
exit (-1);
}
nrext = mixer_dev;
if ( ioctl ( mixer_fd, SNDCTL_MIX_NREXT, &nrext ) == -1 ) { // nrext = 72
perror ("SNDCTL_MIX_NREXT");
return 1;
}
if (ioctl(mixer_fd, SNDCTL_MIX_EXTINFO, &ext) == -1) {
perror("SNDCTL_MIX_EXTINFO");
return 1;
}
/*******************************************************************************************/
/* NOT WORKING */
std::map<const char*, int> NOT_AVAIBLE_MIX_DEV;
for ( int i = 1; i < nrext; i++ ) {
ext.dev = mixer_dev;
ext.ctrl = i;
ioctl(mixer_fd, SNDCTL_MIX_EXTINFO, &ext);
if ( ( ext.type == MIXT_MONOSLIDER ) || ( ext.type == MIXT_STEREOSLIDER ) || (ext.type == MIXF_RECVOL ) ) {
if ( ext.extname != NULL ) {
NOT_AVAIBLE_MIX_DEV[ext.extname] = i;
}
}
}
std::cout << std::endl << "******************************************" << std::endl;
std::cout << "Starting NOT working method..." << std::endl << std::endl;
for (std::map<const char*, int>::iterator it = NOT_AVAIBLE_MIX_DEV.begin(); it != NOT_AVAIBLE_MIX_DEV.end(); ++it) {
std::cout << "it->first: " << it->first << std::endl;
std::cout << "it->second: " << it->second << std::endl;
std::cout << std::endl;
}
std::cout << "End NOT working method." << std::endl;
std::cout << "******************************************" << std::endl << std::endl;
/****************************************************************************************/
/*******************************************************************************************/
/* WORKING */
std::map<std::string, int> NORM_AVAIBLE_MIX_DEV;
for ( int i = 1; i < nrext; i++ ) {
ext.dev = mixer_dev;
ext.ctrl = i;
ioctl(mixer_fd, SNDCTL_MIX_EXTINFO, &ext);
if ( ( ext.type == MIXT_MONOSLIDER ) || ( ext.type == MIXT_STEREOSLIDER ) || (ext.type == MIXF_RECVOL ) ) {
if ( ext.extname != NULL ) {
NORM_AVAIBLE_MIX_DEV[ext.extname] = i;
}
}
}
std::cout << "******************************************" << std::endl;
std::cout << "Starting working method..." << std::endl << std::endl;
for (std::map<std::string, int>::iterator it = NORM_AVAIBLE_MIX_DEV.begin(); it != NORM_AVAIBLE_MIX_DEV.end(); ++it) {
std::cout << "it->first: " << it->first << std::endl;
std::cout << "it->second: " << it->second << std::endl;
std::cout << std::endl;
}
std::cout << "End working method." << std::endl;
std::cout << "******************************************" << std::endl << std::endl;
/****************************************************************************************/
return 0;
}
В итоге выходит такое:
$ ./bug
******************************************
Starting NOT working method...
it->first: vmix0-in
it->second: 34
End NOT working method.
******************************************
******************************************
Starting working method...
it->first: aux1
it->second: 20
it->first: cd
it->second: 15
it->first: center
it->second: 34
it->first: igain
it->second: 18
it->first: line
it->second: 9
it->first: mic
it->second: 12
it->first: mono
it->second: 26
it->first: pcm
it->second: 5
it->first: phone
it->second: 23
it->first: rear
it->second: 32
it->first: speaker
it->second: 7
it->first: video
it->second: 29
it->first: vol
it->second: 2
End working method.
******************************************
Кто-то может почему оно не работает? Может я что-то не то делаю?
Зарание спасибо за ответ.