mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	initialize volume properly, set more properties, modernizations
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/glitch-free@2420 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
		
							parent
							
								
									2eca8c9496
								
							
						
					
					
						commit
						787b869694
					
				
					 1 changed files with 62 additions and 43 deletions
				
			
		| 
						 | 
					@ -1146,6 +1146,8 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
    char hwdesc[64];
 | 
					    char hwdesc[64];
 | 
				
			||||||
    const char *name;
 | 
					    const char *name;
 | 
				
			||||||
    pa_bool_t namereg_fail;
 | 
					    pa_bool_t namereg_fail;
 | 
				
			||||||
 | 
					    pa_sink_new_data sink_new_data;
 | 
				
			||||||
 | 
					    pa_source_new_data source_new_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pa_assert(m);
 | 
					    pa_assert(m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1226,8 +1228,8 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
    m->userdata = u;
 | 
					    m->userdata = u;
 | 
				
			||||||
    u->fd = fd;
 | 
					    u->fd = fd;
 | 
				
			||||||
    u->mixer_fd = -1;
 | 
					    u->mixer_fd = -1;
 | 
				
			||||||
    u->use_getospace = u->use_getispace = 1;
 | 
					    u->use_getospace = u->use_getispace = TRUE;
 | 
				
			||||||
    u->use_getodelay = 1;
 | 
					    u->use_getodelay = TRUE;
 | 
				
			||||||
    u->mode = mode;
 | 
					    u->mode = mode;
 | 
				
			||||||
    u->frame_size = pa_frame_size(&ss);
 | 
					    u->frame_size = pa_frame_size(&ss);
 | 
				
			||||||
    u->device_name = pa_xstrdup(dev);
 | 
					    u->device_name = pa_xstrdup(dev);
 | 
				
			||||||
| 
						 | 
					@ -1243,27 +1245,26 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
        pa_log_info("Input -- %u fragments of size %u.", info.fragstotal, info.fragsize);
 | 
					        pa_log_info("Input -- %u fragments of size %u.", info.fragstotal, info.fragsize);
 | 
				
			||||||
        u->in_fragment_size = info.fragsize;
 | 
					        u->in_fragment_size = info.fragsize;
 | 
				
			||||||
        u->in_nfrags = info.fragstotal;
 | 
					        u->in_nfrags = info.fragstotal;
 | 
				
			||||||
        u->use_getispace = 1;
 | 
					        u->use_getispace = TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) >= 0) {
 | 
					    if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) >= 0) {
 | 
				
			||||||
        pa_log_info("Output -- %u fragments of size %u.", info.fragstotal, info.fragsize);
 | 
					        pa_log_info("Output -- %u fragments of size %u.", info.fragstotal, info.fragsize);
 | 
				
			||||||
        u->out_fragment_size = info.fragsize;
 | 
					        u->out_fragment_size = info.fragsize;
 | 
				
			||||||
        u->out_nfrags = info.fragstotal;
 | 
					        u->out_nfrags = info.fragstotal;
 | 
				
			||||||
        u->use_getospace = 1;
 | 
					        u->use_getospace = TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u->in_hwbuf_size = u->in_nfrags * u->in_fragment_size;
 | 
					    u->in_hwbuf_size = u->in_nfrags * u->in_fragment_size;
 | 
				
			||||||
    u->out_hwbuf_size = u->out_nfrags * u->out_fragment_size;
 | 
					    u->out_hwbuf_size = u->out_nfrags * u->out_fragment_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (mode != O_WRONLY) {
 | 
					    if (mode != O_WRONLY) {
 | 
				
			||||||
        pa_source_new_data data;
 | 
					 | 
				
			||||||
        char *name_buf = NULL;
 | 
					        char *name_buf = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (use_mmap) {
 | 
					        if (use_mmap) {
 | 
				
			||||||
            if ((u->in_mmap = mmap(NULL, u->in_hwbuf_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
 | 
					            if ((u->in_mmap = mmap(NULL, u->in_hwbuf_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
 | 
				
			||||||
                pa_log_warn("mmap(PROT_READ) failed, reverting to non-mmap mode: %s", pa_cstrerror(errno));
 | 
					                pa_log_warn("mmap(PROT_READ) failed, reverting to non-mmap mode: %s", pa_cstrerror(errno));
 | 
				
			||||||
                use_mmap = u->use_mmap = 0;
 | 
					                use_mmap = u->use_mmap = FALSE;
 | 
				
			||||||
                u->in_mmap = NULL;
 | 
					                u->in_mmap = NULL;
 | 
				
			||||||
            } else
 | 
					            } else
 | 
				
			||||||
                pa_log_debug("Successfully mmap()ed input buffer.");
 | 
					                pa_log_debug("Successfully mmap()ed input buffer.");
 | 
				
			||||||
| 
						 | 
					@ -1276,20 +1277,22 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
            namereg_fail = FALSE;
 | 
					            namereg_fail = FALSE;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pa_source_new_data_init(&data);
 | 
					        pa_source_new_data_init(&source_new_data);
 | 
				
			||||||
        data.driver = __FILE__;
 | 
					        source_new_data.driver = __FILE__;
 | 
				
			||||||
        data.module = m;
 | 
					        source_new_data.module = m;
 | 
				
			||||||
        pa_source_new_data_set_name(&data, name);
 | 
					        pa_source_new_data_set_name(&source_new_data, name);
 | 
				
			||||||
        data.namereg_fail = namereg_fail;
 | 
					        source_new_data.namereg_fail = namereg_fail;
 | 
				
			||||||
        pa_source_new_data_set_sample_spec(&data, &ss);
 | 
					        pa_source_new_data_set_sample_spec(&source_new_data, &ss);
 | 
				
			||||||
        pa_source_new_data_set_channel_map(&data, &map);
 | 
					        pa_source_new_data_set_channel_map(&source_new_data, &map);
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, dev);
 | 
					        pa_proplist_sets(source_new_data.proplist, PA_PROP_DEVICE_STRING, dev);
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "oss");
 | 
					        pa_proplist_sets(source_new_data.proplist, PA_PROP_DEVICE_API, "oss");
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, hwdesc[0] ? hwdesc : dev);
 | 
					        pa_proplist_sets(source_new_data.proplist, PA_PROP_DEVICE_DESCRIPTION, hwdesc[0] ? hwdesc : dev);
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, use_mmap ? "mmap" : "serial");
 | 
					        pa_proplist_sets(source_new_data.proplist, PA_PROP_DEVICE_ACCESS_MODE, use_mmap ? "mmap" : "serial");
 | 
				
			||||||
 | 
					        pa_proplist_setf(source_new_data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (u->in_hwbuf_size));
 | 
				
			||||||
 | 
					        pa_proplist_setf(source_new_data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (u->in_fragment_size));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY);
 | 
					        u->source = pa_source_new(m->core, &source_new_data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY);
 | 
				
			||||||
        pa_source_new_data_done(&data);
 | 
					        pa_source_new_data_done(&source_new_data);
 | 
				
			||||||
        pa_xfree(name_buf);
 | 
					        pa_xfree(name_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!u->source) {
 | 
					        if (!u->source) {
 | 
				
			||||||
| 
						 | 
					@ -1309,7 +1312,6 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (mode != O_RDONLY) {
 | 
					    if (mode != O_RDONLY) {
 | 
				
			||||||
        pa_sink_new_data data;
 | 
					 | 
				
			||||||
        char *name_buf = NULL;
 | 
					        char *name_buf = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (use_mmap) {
 | 
					        if (use_mmap) {
 | 
				
			||||||
| 
						 | 
					@ -1320,7 +1322,7 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
                    goto go_on;
 | 
					                    goto go_on;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    pa_log_warn("mmap(PROT_WRITE) failed, reverting to non-mmap mode: %s", pa_cstrerror(errno));
 | 
					                    pa_log_warn("mmap(PROT_WRITE) failed, reverting to non-mmap mode: %s", pa_cstrerror(errno));
 | 
				
			||||||
                    u->use_mmap = (use_mmap = FALSE);
 | 
					                    u->use_mmap = use_mmap = FALSE;
 | 
				
			||||||
                    u->out_mmap = NULL;
 | 
					                    u->out_mmap = NULL;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
| 
						 | 
					@ -1330,26 +1332,28 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ((name = pa_modargs_get_value(ma, "sink_name", NULL)))
 | 
					        if ((name = pa_modargs_get_value(ma, "sink_name", NULL)))
 | 
				
			||||||
            namereg_fail = 1;
 | 
					            namereg_fail = TRUE;
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            name = name_buf = pa_sprintf_malloc("oss_output.%s", pa_path_get_filename(dev));
 | 
					            name = name_buf = pa_sprintf_malloc("oss_output.%s", pa_path_get_filename(dev));
 | 
				
			||||||
            namereg_fail = 0;
 | 
					            namereg_fail = FALSE;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pa_sink_new_data_init(&data);
 | 
					        pa_sink_new_data_init(&sink_new_data);
 | 
				
			||||||
        data.driver = __FILE__;
 | 
					        sink_new_data.driver = __FILE__;
 | 
				
			||||||
        data.module = m;
 | 
					        sink_new_data.module = m;
 | 
				
			||||||
        pa_sink_new_data_set_name(&data, name);
 | 
					        pa_sink_new_data_set_name(&sink_new_data, name);
 | 
				
			||||||
        data.namereg_fail = namereg_fail;
 | 
					        sink_new_data.namereg_fail = namereg_fail;
 | 
				
			||||||
        pa_sink_new_data_set_sample_spec(&data, &ss);
 | 
					        pa_sink_new_data_set_sample_spec(&sink_new_data, &ss);
 | 
				
			||||||
        pa_sink_new_data_set_channel_map(&data, &map);
 | 
					        pa_sink_new_data_set_channel_map(&sink_new_data, &map);
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, dev);
 | 
					        pa_proplist_sets(sink_new_data.proplist, PA_PROP_DEVICE_STRING, dev);
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "oss");
 | 
					        pa_proplist_sets(sink_new_data.proplist, PA_PROP_DEVICE_API, "oss");
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, hwdesc[0] ? hwdesc : dev);
 | 
					        pa_proplist_sets(sink_new_data.proplist, PA_PROP_DEVICE_DESCRIPTION, hwdesc[0] ? hwdesc : dev);
 | 
				
			||||||
        pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, use_mmap ? "mmap" : "serial");
 | 
					        pa_proplist_sets(sink_new_data.proplist, PA_PROP_DEVICE_ACCESS_MODE, use_mmap ? "mmap" : "serial");
 | 
				
			||||||
 | 
					        pa_proplist_setf(sink_new_data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (u->out_hwbuf_size));
 | 
				
			||||||
 | 
					        pa_proplist_setf(sink_new_data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (u->out_fragment_size));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        u->sink = pa_sink_new(m->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY);
 | 
					        u->sink = pa_sink_new(m->core, &sink_new_data, PA_SINK_HARDWARE|PA_SINK_LATENCY);
 | 
				
			||||||
        pa_sink_new_data_done(&data);
 | 
					        pa_sink_new_data_done(&sink_new_data);
 | 
				
			||||||
        pa_xfree(name_buf);
 | 
					        pa_xfree(name_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!u->sink) {
 | 
					        if (!u->sink) {
 | 
				
			||||||
| 
						 | 
					@ -1369,7 +1373,7 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((u->mixer_fd = pa_oss_open_mixer_for_device(u->device_name)) >= 0) {
 | 
					    if ((u->mixer_fd = pa_oss_open_mixer_for_device(u->device_name)) >= 0) {
 | 
				
			||||||
        int do_close = 1;
 | 
					        pa_bool_t do_close = TRUE;
 | 
				
			||||||
        u->mixer_devmask = 0;
 | 
					        u->mixer_devmask = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (ioctl(fd, SOUND_MIXER_READ_DEVMASK, &u->mixer_devmask) < 0)
 | 
					        if (ioctl(fd, SOUND_MIXER_READ_DEVMASK, &u->mixer_devmask) < 0)
 | 
				
			||||||
| 
						 | 
					@ -1381,7 +1385,7 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
                u->sink->flags |= PA_SINK_HW_VOLUME_CTRL;
 | 
					                u->sink->flags |= PA_SINK_HW_VOLUME_CTRL;
 | 
				
			||||||
                u->sink->get_volume = sink_get_volume;
 | 
					                u->sink->get_volume = sink_get_volume;
 | 
				
			||||||
                u->sink->set_volume = sink_set_volume;
 | 
					                u->sink->set_volume = sink_set_volume;
 | 
				
			||||||
                do_close = 0;
 | 
					                do_close = FALSE;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (u->source && (u->mixer_devmask & (SOUND_MASK_RECLEV|SOUND_MASK_IGAIN))) {
 | 
					            if (u->source && (u->mixer_devmask & (SOUND_MASK_RECLEV|SOUND_MASK_IGAIN))) {
 | 
				
			||||||
| 
						 | 
					@ -1389,7 +1393,7 @@ int pa__init(pa_module*m) {
 | 
				
			||||||
                u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL;
 | 
					                u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL;
 | 
				
			||||||
                u->source->get_volume = source_get_volume;
 | 
					                u->source->get_volume = source_get_volume;
 | 
				
			||||||
                u->source->set_volume = source_set_volume;
 | 
					                u->source->set_volume = source_set_volume;
 | 
				
			||||||
                do_close = 0;
 | 
					                do_close = FALSE;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1411,10 +1415,25 @@ go_on:
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Read mixer settings */
 | 
					    /* Read mixer settings */
 | 
				
			||||||
    if (u->sink && u->sink->get_volume)
 | 
					    if (u->sink) {
 | 
				
			||||||
        sink_get_volume(u->sink);
 | 
					        if (sink_new_data.volume_is_set) {
 | 
				
			||||||
    if (u->source && u->source->get_volume)
 | 
					            if (u->sink->set_volume)
 | 
				
			||||||
        source_get_volume(u->source);
 | 
					                u->sink->set_volume(u->sink);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            if (u->sink->get_volume)
 | 
				
			||||||
 | 
					                u->sink->get_volume(u->sink);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (u->source) {
 | 
				
			||||||
 | 
					        if (source_new_data.volume_is_set) {
 | 
				
			||||||
 | 
					            if (u->source->set_volume)
 | 
				
			||||||
 | 
					                u->source->set_volume(u->source);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            if (u->source->get_volume)
 | 
				
			||||||
 | 
					                u->source->get_volume(u->source);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (u->sink)
 | 
					    if (u->sink)
 | 
				
			||||||
        pa_sink_put(u->sink);
 | 
					        pa_sink_put(u->sink);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue